| /* |
| * brstate.c RTnetlink port state change |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version |
| * 2 of the License, or (at your option) any later version. |
| * |
| * Authors: Stephen Hemminger <shemminger@osdl.org> |
| * |
| * Modified by Srinivas Aji <Aji_Srinivas@emc.com> for use |
| * in RSTP daemon. - 2006-09-01 |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <syslog.h> |
| #include <fcntl.h> |
| #include <sys/socket.h> |
| #include <sys/time.h> |
| #include <net/if.h> |
| #include <netinet/in.h> |
| #include <linux/if_bridge.h> |
| #include <string.h> |
| |
| #include "libnetlink.h" |
| |
| static int br_set_state(struct rtnl_handle *rth, unsigned ifindex, __u8 state) |
| { |
| struct { |
| struct nlmsghdr n; |
| struct ifinfomsg ifi; |
| char buf[256]; |
| } req; |
| |
| memset(&req, 0, sizeof(req)); |
| |
| req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); |
| req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_REPLACE; |
| req.n.nlmsg_type = RTM_SETLINK; |
| req.ifi.ifi_family = AF_BRIDGE; |
| req.ifi.ifi_index = ifindex; |
| |
| addattr32(&req.n, sizeof(req.buf), IFLA_PROTINFO, state); |
| |
| return rtnl_talk(rth, &req.n, 0, 0, NULL, NULL, NULL); |
| } |
| |
| #include "bridge_ctl.h" |
| |
| extern struct rtnl_handle rth_state; |
| |
| int bridge_set_state(int ifindex, int brstate) |
| { |
| int err = br_set_state(&rth_state, ifindex, brstate); |
| if (err < 0) { |
| fprintf(stderr, |
| "Couldn't set bridge state, ifindex %d, state %d\n", |
| ifindex, brstate); |
| return -1; |
| } |
| return 0; |
| } |