--- zzzz-none-000/linux-2.6.32.61/net/bridge/br_netlink.c 2013-06-10 09:43:48.000000000 +0000 +++ ar10-7272-687/linux-2.6.32.61/net/bridge/br_netlink.c 2014-08-12 13:03:17.000000000 +0000 @@ -11,11 +11,14 @@ */ #include +#include #include #include #include #include "br_private.h" +/* This file is a copy of the file as of commit ec1e5610c00c7f5bc530d2aadd47faa473b90a30 */ + static inline size_t br_nlmsg_size(void) { return NLMSG_ALIGN(sizeof(struct ifinfomsg)) @@ -41,8 +44,8 @@ struct nlmsghdr *nlh; u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN; - pr_debug("br_fill_info event %d port %s master %s\n", - event, dev->name, br->dev->name); + br_debug(br, "br_fill_info event %d port %s master %s\n", + event, dev->name, br->dev->name); nlh = nlmsg_put(skb, pid, seq, event, sizeof(*hdr), flags); if (nlh == NULL) @@ -86,7 +89,9 @@ struct sk_buff *skb; int err = -ENOBUFS; - pr_debug("bridge notify event=%d\n", event); + br_debug(port->br, "port %u(%s) event %d\n", + (unsigned)port->port_no, port->dev->name, event); + skb = nlmsg_new(br_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; @@ -116,11 +121,14 @@ idx = 0; for_each_netdev(net, dev) { + struct net_bridge_port *port = br_port_get_rtnl(dev); + /* not a bridge port */ - if (dev->br_port == NULL || idx < cb->args[0]) + if (!port || idx < cb->args[0]) goto skip; - if (br_fill_ifinfo(skb, dev->br_port, NETLINK_CB(cb->skb).pid, + if (br_fill_ifinfo(skb, port, + NETLINK_CB(cb->skb).pid, cb->nlh->nlmsg_seq, RTM_NEWLINK, NLM_F_MULTI) < 0) break; @@ -165,7 +173,7 @@ if (!dev) return -ENODEV; - p = dev->br_port; + p = br_port_get_rtnl(dev); if (!p) return -EINVAL; @@ -182,7 +190,6 @@ return 0; } - int __init br_netlink_init(void) { if (__rtnl_register(PF_BRIDGE, RTM_GETLINK, NULL, br_dump_ifinfo)) @@ -191,6 +198,8 @@ /* Only the first call to __rtnl_register can fail */ __rtnl_register(PF_BRIDGE, RTM_SETLINK, br_rtm_setlink, NULL); + br_mdb_init(); + return 0; }