+++ /dev/null
-Index: bridge_ctl.h
-===================================================================
---- bridge_ctl.h (revision 16)
-+++ bridge_ctl.h (working copy)
-@@ -81,7 +81,7 @@
-
- int init_bridge_ops(void);
-
--int bridge_notify(int br_index, int if_index, bool newlink, bool up);
-+int bridge_notify(int br_index, int if_index, bool newlink, unsigned flags);
-
- void bridge_bpdu_rcv(int ifindex, const unsigned char *data, int len);
-
-Index: brmon.c
-===================================================================
---- brmon.c (revision 16)
-+++ brmon.c (working copy)
-@@ -66,7 +66,7 @@
- int len = n->nlmsg_len;
- char b1[IFNAMSIZ];
- int af_family = ifi->ifi_family;
-- bool newlink, up;
-+ bool newlink;
- int br_index;
-
- if(n->nlmsg_type == NLMSG_DONE)
-@@ -154,12 +154,6 @@
- fflush(fp);
-
- newlink = (n->nlmsg_type == RTM_NEWLINK);
-- up = false;
-- if(newlink && tb[IFLA_OPERSTATE])
-- {
-- int state = *(uint8_t*)RTA_DATA(tb[IFLA_OPERSTATE]);
-- up = (state == IF_OPER_UP) || (state == IF_OPER_UNKNOWN);
-- }
-
- if(tb[IFLA_MASTER])
- br_index = *(int*)RTA_DATA(tb[IFLA_MASTER]);
-@@ -168,7 +162,7 @@
- else
- br_index = -1;
-
-- bridge_notify(br_index, ifi->ifi_index, newlink, up);
-+ bridge_notify(br_index, ifi->ifi_index, newlink, ifi->ifi_flags);
-
- return 0;
- }
-Index: bridge_track.c
-===================================================================
---- bridge_track.c (revision 16)
-+++ bridge_track.c (working copy)
-@@ -279,13 +279,15 @@
- }
-
- /* br_index == if_index means: interface is bridge master */
--int bridge_notify(int br_index, int if_index, bool newlink, bool up)
-+int bridge_notify(int br_index, int if_index, bool newlink, unsigned flags)
- {
- port_t *ifc;
- bridge_t *br = NULL, *other_br;
-+ bool up = !!(flags & IFF_UP);
-+ bool running = up && (flags & IFF_RUNNING);
-
-- LOG("br_index %d, if_index %d, newlink %d, up %d",
-- br_index, if_index, newlink, up);
-+ LOG("br_index %d, if_index %d, newlink %d, up %d, running %d",
-+ br_index, if_index, newlink, up, running);
-
- if((br_index >= 0) && (br_index != if_index))
- {
-@@ -296,9 +298,9 @@
- ERROR("Couldn't create data for bridge interface %d", br_index);
- return -1;
- }
-- int br_up = ethtool_get_link(br->sysdeps.name);
-- if(br_up >= 0)
-- set_br_up(br, !!br_up);
-+ int br_flags = get_flags(br->sysdeps.name);
-+ if(br_flags >= 0)
-+ set_br_up(br, !!(flags & IFF_UP));
- }
-
- if(br)
-@@ -336,7 +338,7 @@
- delete_if(ifc);
- return 0;
- }
-- set_if_up(ifc, up); /* And speed and duplex */
-+ set_if_up(ifc, running); /* And speed and duplex */
- }
- else
- { /* Interface is not a bridge slave */
-Index: netif_utils.c
-===================================================================
---- netif_utils.c (revision 16)
-+++ netif_utils.c (working copy)
-@@ -65,23 +65,17 @@
- return 0;
- }
-
--int ethtool_get_link(char *ifname)
-+int get_flags(char *ifname)
- {
- struct ifreq ifr;
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
-- struct ethtool_value eval;
--
-- eval.cmd = ETHTOOL_GLINK;
-- ifr.ifr_data = (caddr_t)&eval;
-- if(0 > ioctl(netsock, SIOCETHTOOL, &ifr))
-+ if(0 > ioctl(netsock, SIOCGIFFLAGS, &ifr))
- {
-- ERROR("Cannot get link status for %s: %m\n", ifname);
-+ ERROR("%s: get interface flags failed: %m", ifname);
- return -1;
- }
-- if(eval.data)
-- return 1;
-- return 0;
-+ return ifr.ifr_flags;
- }
-
- int ethtool_get_speed_duplex(char *ifname, int *speed, int *duplex)
-Index: netif_utils.h
-===================================================================
---- netif_utils.h (revision 16)
-+++ netif_utils.h (working copy)
-@@ -31,9 +31,9 @@
- int netsock_init(void);
-
- int get_hwaddr(char *ifname, unsigned char *hwaddr);
-+int get_flags(char *ifname);
-
- int ethtool_get_speed_duplex(char *ifname, int *speed, int *duplex);
--int ethtool_get_link(char *ifname);
-
- bool is_bridge(char *if_name);
-