Nikolay Aleksandrov
2015-Oct-06  12:11 UTC
[Bridge] [PATCH net-next 1/8] bridge: netlink: export port's root id
From: Nikolay Aleksandrov <nikolay at cumulusnetworks.com>
Add IFLA_BRPORT_ROOT_ID to allow getting the designated root id via
netlink.
Signed-off-by: Nikolay Aleksandrov <nikolay at cumulusnetworks.com>
---
 include/uapi/linux/if_link.h | 1 +
 net/bridge/br_netlink.c      | 5 ++++-
 2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h
index c5b15bfeabe2..c45c1d7894e7 100644
--- a/include/uapi/linux/if_link.h
+++ b/include/uapi/linux/if_link.h
@@ -292,6 +292,7 @@ enum {
 	IFLA_BRPORT_PROXYARP,	/* proxy ARP */
 	IFLA_BRPORT_LEARNING_SYNC, /* mac learning sync from device */
 	IFLA_BRPORT_PROXYARP_WIFI, /* proxy ARP for Wi-Fi */
+	IFLA_BRPORT_ROOT_ID,	/* designated root */
 	__IFLA_BRPORT_MAX
 };
 #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index 330abf4b033a..cad4050310ee 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -127,6 +127,7 @@ static inline size_t br_port_info_size(void)
 		+ nla_total_size(1)	/* IFLA_BRPORT_UNICAST_FLOOD */
 		+ nla_total_size(1)	/* IFLA_BRPORT_PROXYARP */
 		+ nla_total_size(1)	/* IFLA_BRPORT_PROXYARP_WIFI */
+		+ nla_total_size(sizeof(struct ifla_bridge_id))	/* IFLA_BRPORT_ROOT_ID */
 		+ 0;
 }
 
@@ -160,7 +161,9 @@ static int br_port_fill_attrs(struct sk_buff *skb,
 	    nla_put_u8(skb, IFLA_BRPORT_UNICAST_FLOOD, !!(p->flags & BR_FLOOD))
||
 	    nla_put_u8(skb, IFLA_BRPORT_PROXYARP, !!(p->flags & BR_PROXYARP))
||
 	    nla_put_u8(skb, IFLA_BRPORT_PROXYARP_WIFI,
-		       !!(p->flags & BR_PROXYARP_WIFI)))
+		       !!(p->flags & BR_PROXYARP_WIFI)) ||
+	    nla_put(skb, IFLA_BRPORT_ROOT_ID, sizeof(struct ifla_bridge_id),
+		    &p->designated_root))
 		return -EMSGSIZE;
 
 	return 0;
-- 
2.4.3
kbuild test robot
2015-Oct-06  12:30 UTC
[Bridge] [PATCH net-next 1/8] bridge: netlink: export port's root id
Hi Nikolay,
[auto build test ERROR on v4.3-rc4 -- if it's inappropriate base, please
ignore]
config: x86_64-randconfig-x016-201540 (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 
All error/warnings (new ones prefixed by >>):
   net/bridge/br_netlink.c: In function
'br_port_info_size':>> net/bridge/br_netlink.c:116:27: error: invalid application of
'sizeof' to incomplete type 'struct ifla_bridge_id'
      + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_ROOT_ID */
                              ^
   net/bridge/br_netlink.c: In function 'br_port_fill_attrs':
   net/bridge/br_netlink.c:151:47: error: invalid application of
'sizeof' to incomplete type 'struct ifla_bridge_id'
         nla_put(skb, IFLA_BRPORT_ROOT_ID, sizeof(struct ifla_bridge_id),
                                                  ^
   net/bridge/br_netlink.c: In function
'br_port_info_size':>> net/bridge/br_netlink.c:118:1: warning: control reaches end of non-void
function [-Wreturn-type]
    }
    ^
vim +116 net/bridge/br_netlink.c
   110			+ nla_total_size(1)	/* IFLA_BRPORT_PROTECT */
   111			+ nla_total_size(1)	/* IFLA_BRPORT_FAST_LEAVE */
   112			+ nla_total_size(1)	/* IFLA_BRPORT_LEARNING */
   113			+ nla_total_size(1)	/* IFLA_BRPORT_UNICAST_FLOOD */
   114			+ nla_total_size(1)	/* IFLA_BRPORT_PROXYARP */
   115			+ nla_total_size(1)	/* IFLA_BRPORT_PROXYARP_WIFI */
 > 116			+ nla_total_size(sizeof(struct ifla_bridge_id))	/*
IFLA_BRPORT_ROOT_ID */
   117			+ 0;
 > 118	}
   119	
   120	static inline size_t br_nlmsg_size(struct net_device *dev, u32
filter_mask)
   121	{
---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/octet-stream
Size: 25228 bytes
Desc: not available
URL:
<http://lists.linuxfoundation.org/pipermail/bridge/attachments/20151006/01e922c3/attachment-0001.obj>
kbuild test robot
2015-Oct-06  12:30 UTC
[Bridge] [PATCH net-next 1/8] bridge: netlink: export port's root id
Hi Nikolay,
[auto build test WARNING on v4.3-rc4 -- if it's inappropriate base, please
ignore]
config: i386-randconfig-x006-201540 (attached as .config)
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 
All warnings (new ones prefixed by >>):
   net/bridge/br_netlink.c: In function 'br_port_info_size':
   net/bridge/br_netlink.c:116:27: error: invalid application of
'sizeof' to incomplete type 'struct ifla_bridge_id'
      + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_ROOT_ID */
                              ^
   In file included from include/linux/linkage.h:4:0,
                    from include/linux/kernel.h:6,
                    from net/bridge/br_netlink.c:13:
   net/bridge/br_netlink.c: In function 'br_port_fill_attrs':
   net/bridge/br_netlink.c:151:47: error: invalid application of
'sizeof' to incomplete type 'struct ifla_bridge_id'
         nla_put(skb, IFLA_BRPORT_ROOT_ID, sizeof(struct ifla_bridge_id),
                                                  ^
   include/linux/compiler.h:147:28: note: in definition of macro
'__trace_if'
     if (__builtin_constant_p((cond)) ? !!(cond) :   \
                               ^>> net/bridge/br_netlink.c:139:2: note: in expansion of macro 'if'
     if (nla_put_u8(skb, IFLA_BRPORT_STATE, p->state) ||
     ^
   net/bridge/br_netlink.c:151:47: error: invalid application of
'sizeof' to incomplete type 'struct ifla_bridge_id'
         nla_put(skb, IFLA_BRPORT_ROOT_ID, sizeof(struct ifla_bridge_id),
                                                  ^
   include/linux/compiler.h:147:40: note: in definition of macro
'__trace_if'
     if (__builtin_constant_p((cond)) ? !!(cond) :   \
                                           ^>> net/bridge/br_netlink.c:139:2: note: in expansion of macro 'if'
     if (nla_put_u8(skb, IFLA_BRPORT_STATE, p->state) ||
     ^
   net/bridge/br_netlink.c:151:47: error: invalid application of
'sizeof' to incomplete type 'struct ifla_bridge_id'
         nla_put(skb, IFLA_BRPORT_ROOT_ID, sizeof(struct ifla_bridge_id),
                                                  ^
   include/linux/compiler.h:158:16: note: in definition of macro
'__trace_if'
      ______r = !!(cond);     \
                   ^>> net/bridge/br_netlink.c:139:2: note: in expansion of macro 'if'
     if (nla_put_u8(skb, IFLA_BRPORT_STATE, p->state) ||
     ^
   net/bridge/br_netlink.c: In function 'br_port_info_size':
   net/bridge/br_netlink.c:118:1: warning: control reaches end of non-void
function [-Wreturn-type]
    }
    ^
vim +/if +139 net/bridge/br_netlink.c
11dc1f36 Stephen Hemminger   2006-05-25    7   *	This program is free software;
you can redistribute it and/or
11dc1f36 Stephen Hemminger   2006-05-25    8   *	modify it under the terms of
the GNU General Public License
11dc1f36 Stephen Hemminger   2006-05-25    9   *	as published by the Free
Software Foundation; either version
11dc1f36 Stephen Hemminger   2006-05-25   10   *	2 of the License, or (at your
option) any later version.
11dc1f36 Stephen Hemminger   2006-05-25   11   */
11dc1f36 Stephen Hemminger   2006-05-25   12  
11dc1f36 Stephen Hemminger   2006-05-25  @13  #include <linux/kernel.h>
5a0e3ad6 Tejun Heo           2010-03-24   14  #include <linux/slab.h>
bb900b27 stephen hemminger   2011-04-04   15  #include
<linux/etherdevice.h>
32fe21c0 Thomas Graf         2007-03-22   16  #include <net/rtnetlink.h>
881d966b Eric W. Biederman   2007-09-17   17  #include
<net/net_namespace.h>
b854272b Denis V. Lunev      2007-12-01   18  #include <net/sock.h>
407af329 Vlad Yasevich       2013-02-13   19  #include
<uapi/linux/if_bridge.h>
bb900b27 stephen hemminger   2011-04-04   20  
11dc1f36 Stephen Hemminger   2006-05-25   21  #include "br_private.h"
b03b6dd5 Vitalii Demianets   2011-11-25   22  #include
"br_private_stp.h"
11dc1f36 Stephen Hemminger   2006-05-25   23  
fed0a159 Roopa Prabhu        2015-02-25   24  static int
br_get_num_vlan_infos(const struct net_port_vlans *pv,
fed0a159 Roopa Prabhu        2015-02-25   25  				 u32 filter_mask)
fed0a159 Roopa Prabhu        2015-02-25   26  {
fed0a159 Roopa Prabhu        2015-02-25   27  	u16 vid_range_start = 0,
vid_range_end = 0;
fed0a159 Roopa Prabhu        2015-02-25   28  	u16 vid_range_flags = 0;
fed0a159 Roopa Prabhu        2015-02-25   29  	u16 pvid, vid, flags;
fed0a159 Roopa Prabhu        2015-02-25   30  	int num_vlans = 0;
fed0a159 Roopa Prabhu        2015-02-25   31  
fed0a159 Roopa Prabhu        2015-02-25   32  	if (filter_mask &
RTEXT_FILTER_BRVLAN)
fed0a159 Roopa Prabhu        2015-02-25   33  		return pv->num_vlans;
fed0a159 Roopa Prabhu        2015-02-25   34  
fed0a159 Roopa Prabhu        2015-02-25   35  	if (!(filter_mask &
RTEXT_FILTER_BRVLAN_COMPRESSED))
fed0a159 Roopa Prabhu        2015-02-25   36  		return 0;
fed0a159 Roopa Prabhu        2015-02-25   37  
fed0a159 Roopa Prabhu        2015-02-25   38  	/* Count number of vlan
info's
fed0a159 Roopa Prabhu        2015-02-25   39  	 */
fed0a159 Roopa Prabhu        2015-02-25   40  	pvid = br_get_pvid(pv);
fed0a159 Roopa Prabhu        2015-02-25   41  	for_each_set_bit(vid,
pv->vlan_bitmap, VLAN_N_VID) {
fed0a159 Roopa Prabhu        2015-02-25   42  		flags = 0;
fed0a159 Roopa Prabhu        2015-02-25   43  		if (vid == pvid)
fed0a159 Roopa Prabhu        2015-02-25   44  			flags |= BRIDGE_VLAN_INFO_PVID;
fed0a159 Roopa Prabhu        2015-02-25   45  
fed0a159 Roopa Prabhu        2015-02-25   46  		if (test_bit(vid,
pv->untagged_bitmap))
fed0a159 Roopa Prabhu        2015-02-25   47  			flags |=
BRIDGE_VLAN_INFO_UNTAGGED;
fed0a159 Roopa Prabhu        2015-02-25   48  
fed0a159 Roopa Prabhu        2015-02-25   49  		if (vid_range_start == 0) {
fed0a159 Roopa Prabhu        2015-02-25   50  			goto initvars;
fed0a159 Roopa Prabhu        2015-02-25   51  		} else if ((vid - vid_range_end)
== 1 &&
fed0a159 Roopa Prabhu        2015-02-25   52  			flags == vid_range_flags) {
fed0a159 Roopa Prabhu        2015-02-25   53  			vid_range_end = vid;
fed0a159 Roopa Prabhu        2015-02-25   54  			continue;
fed0a159 Roopa Prabhu        2015-02-25   55  		} else {
fed0a159 Roopa Prabhu        2015-02-25   56  			if ((vid_range_end -
vid_range_start) > 0)
fed0a159 Roopa Prabhu        2015-02-25   57  				num_vlans += 2;
fed0a159 Roopa Prabhu        2015-02-25   58  			else
fed0a159 Roopa Prabhu        2015-02-25   59  				num_vlans += 1;
fed0a159 Roopa Prabhu        2015-02-25   60  		}
fed0a159 Roopa Prabhu        2015-02-25   61  initvars:
fed0a159 Roopa Prabhu        2015-02-25   62  		vid_range_start = vid;
fed0a159 Roopa Prabhu        2015-02-25   63  		vid_range_end = vid;
fed0a159 Roopa Prabhu        2015-02-25   64  		vid_range_flags = flags;
fed0a159 Roopa Prabhu        2015-02-25   65  	}
fed0a159 Roopa Prabhu        2015-02-25   66  
fed0a159 Roopa Prabhu        2015-02-25   67  	if (vid_range_start != 0) {
fed0a159 Roopa Prabhu        2015-02-25   68  		if ((vid_range_end -
vid_range_start) > 0)
fed0a159 Roopa Prabhu        2015-02-25   69  			num_vlans += 2;
fed0a159 Roopa Prabhu        2015-02-25   70  		else
fed0a159 Roopa Prabhu        2015-02-25   71  			num_vlans += 1;
fed0a159 Roopa Prabhu        2015-02-25   72  	}
fed0a159 Roopa Prabhu        2015-02-25   73  
fed0a159 Roopa Prabhu        2015-02-25   74  	return num_vlans;
fed0a159 Roopa Prabhu        2015-02-25   75  }
fed0a159 Roopa Prabhu        2015-02-25   76  
fed0a159 Roopa Prabhu        2015-02-25   77  static size_t
br_get_link_af_size_filtered(const struct net_device *dev,
fed0a159 Roopa Prabhu        2015-02-25   78  					   u32 filter_mask)
b7853d73 Roopa Prabhu        2015-02-21   79  {
b7853d73 Roopa Prabhu        2015-02-21   80  	struct net_port_vlans *pv;
fed0a159 Roopa Prabhu        2015-02-25   81  	int num_vlan_infos;
b7853d73 Roopa Prabhu        2015-02-21   82  
2f56f6be Johannes Berg       2015-03-03   83  	rcu_read_lock();
b7853d73 Roopa Prabhu        2015-02-21   84  	if (br_port_exists(dev))
2f56f6be Johannes Berg       2015-03-03   85  		pv =
nbp_get_vlan_info(br_port_get_rcu(dev));
b7853d73 Roopa Prabhu        2015-02-21   86  	else if (dev->priv_flags &
IFF_EBRIDGE)
b7853d73 Roopa Prabhu        2015-02-21   87  		pv = br_get_vlan_info((struct
net_bridge *)netdev_priv(dev));
b7853d73 Roopa Prabhu        2015-02-21   88  	else
2f56f6be Johannes Berg       2015-03-03   89  		pv = NULL;
2f56f6be Johannes Berg       2015-03-03   90  	if (pv)
fed0a159 Roopa Prabhu        2015-02-25   91  		num_vlan_infos =
br_get_num_vlan_infos(pv, filter_mask);
2f56f6be Johannes Berg       2015-03-03   92  	else
2f56f6be Johannes Berg       2015-03-03   93  		num_vlan_infos = 0;
2f56f6be Johannes Berg       2015-03-03   94  	rcu_read_unlock();
2f56f6be Johannes Berg       2015-03-03   95  
fed0a159 Roopa Prabhu        2015-02-25   96  	if (!num_vlan_infos)
fed0a159 Roopa Prabhu        2015-02-25   97  		return 0;
fed0a159 Roopa Prabhu        2015-02-25   98  
b7853d73 Roopa Prabhu        2015-02-21   99  	/* Each VLAN is returned in
bridge_vlan_info along with flags */
fed0a159 Roopa Prabhu        2015-02-25  100  	return num_vlan_infos *
nla_total_size(sizeof(struct bridge_vlan_info));
b7853d73 Roopa Prabhu        2015-02-21  101  }
b7853d73 Roopa Prabhu        2015-02-21  102  
25c71c75 stephen hemminger   2012-11-13  103  static inline size_t
br_port_info_size(void)
25c71c75 stephen hemminger   2012-11-13  104  {
25c71c75 stephen hemminger   2012-11-13  105  	return nla_total_size(1)	/*
IFLA_BRPORT_STATE  */
25c71c75 stephen hemminger   2012-11-13  106  		+ nla_total_size(2)	/*
IFLA_BRPORT_PRIORITY */
25c71c75 stephen hemminger   2012-11-13  107  		+ nla_total_size(4)	/*
IFLA_BRPORT_COST */
25c71c75 stephen hemminger   2012-11-13  108  		+ nla_total_size(1)	/*
IFLA_BRPORT_MODE */
a2e01a65 stephen hemminger   2012-11-13  109  		+ nla_total_size(1)	/*
IFLA_BRPORT_GUARD */
1007dd1a stephen hemminger   2012-11-13  110  		+ nla_total_size(1)	/*
IFLA_BRPORT_PROTECT */
3da889b6 stephen hemminger   2013-03-11  111  		+ nla_total_size(1)	/*
IFLA_BRPORT_FAST_LEAVE */
9ba18891 Vlad Yasevich       2013-06-05  112  		+ nla_total_size(1)	/*
IFLA_BRPORT_LEARNING */
867a5943 Vlad Yasevich       2013-06-05  113  		+ nla_total_size(1)	/*
IFLA_BRPORT_UNICAST_FLOOD */
355b9f9d Nikolay Aleksandrov 2015-08-04  114  		+ nla_total_size(1)	/*
IFLA_BRPORT_PROXYARP */
786c2077 Nikolay Aleksandrov 2015-08-04  115  		+ nla_total_size(1)	/*
IFLA_BRPORT_PROXYARP_WIFI */
1706db4b Nikolay Aleksandrov 2015-10-06  116  		+ nla_total_size(sizeof(struct
ifla_bridge_id))	/* IFLA_BRPORT_ROOT_ID */
25c71c75 stephen hemminger   2012-11-13  117  		+ 0;
25c71c75 stephen hemminger   2012-11-13  118  }
25c71c75 stephen hemminger   2012-11-13  119  
fed0a159 Roopa Prabhu        2015-02-25  120  static inline size_t
br_nlmsg_size(struct net_device *dev, u32 filter_mask)
339bf98f Thomas Graf         2006-11-10  121  {
339bf98f Thomas Graf         2006-11-10  122  	return NLMSG_ALIGN(sizeof(struct
ifinfomsg))
339bf98f Thomas Graf         2006-11-10  123  		+ nla_total_size(IFNAMSIZ) /*
IFLA_IFNAME */
339bf98f Thomas Graf         2006-11-10  124  		+ nla_total_size(MAX_ADDR_LEN)
/* IFLA_ADDRESS */
339bf98f Thomas Graf         2006-11-10  125  		+ nla_total_size(4) /*
IFLA_MASTER */
339bf98f Thomas Graf         2006-11-10  126  		+ nla_total_size(4) /* IFLA_MTU
*/
339bf98f Thomas Graf         2006-11-10  127  		+ nla_total_size(4) /* IFLA_LINK
*/
339bf98f Thomas Graf         2006-11-10  128  		+ nla_total_size(1) /*
IFLA_OPERSTATE */
b7853d73 Roopa Prabhu        2015-02-21  129  		+
nla_total_size(br_port_info_size()) /* IFLA_PROTINFO */
fed0a159 Roopa Prabhu        2015-02-25  130  		+
nla_total_size(br_get_link_af_size_filtered(dev,
fed0a159 Roopa Prabhu        2015-02-25  131  				 filter_mask)); /*
IFLA_AF_SPEC */
25c71c75 stephen hemminger   2012-11-13  132  }
25c71c75 stephen hemminger   2012-11-13  133  
25c71c75 stephen hemminger   2012-11-13  134  static int
br_port_fill_attrs(struct sk_buff *skb,
25c71c75 stephen hemminger   2012-11-13  135  			      const struct
net_bridge_port *p)
25c71c75 stephen hemminger   2012-11-13  136  {
25c71c75 stephen hemminger   2012-11-13  137  	u8 mode = !!(p->flags &
BR_HAIRPIN_MODE);
25c71c75 stephen hemminger   2012-11-13  138  
25c71c75 stephen hemminger   2012-11-13 @139  	if (nla_put_u8(skb,
IFLA_BRPORT_STATE, p->state) ||
25c71c75 stephen hemminger   2012-11-13  140  	    nla_put_u16(skb,
IFLA_BRPORT_PRIORITY, p->priority) ||
25c71c75 stephen hemminger   2012-11-13  141  	    nla_put_u32(skb,
IFLA_BRPORT_COST, p->path_cost) ||
a2e01a65 stephen hemminger   2012-11-13  142  	    nla_put_u8(skb,
IFLA_BRPORT_MODE, mode) ||
:::::: The code at line 139 was first introduced by commit
:::::: 25c71c75ac87508528db053b818944f3650dd7a6 bridge: bridge port parameters
over netlink
:::::: TO: stephen hemminger <shemminger at vyatta.com>
:::::: CC: David S. Miller <davem at davemloft.net>
---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/octet-stream
Size: 30865 bytes
Desc: not available
URL:
<http://lists.linuxfoundation.org/pipermail/bridge/attachments/20151006/ae465214/attachment-0001.obj>
Nikolay Aleksandrov
2015-Oct-06  12:43 UTC
[Bridge] [PATCH net-next 1/8] bridge: netlink: export port's root id
On 10/06/2015 02:30 PM, kbuild test robot wrote:> Hi Nikolay, > > [auto build test ERROR on v4.3-rc4 -- if it's inappropriate base, please ignore] > > config: x86_64-randconfig-x016-201540 (attached as .config) > reproduce: > # save the attached .config to linux build tree > make ARCH=x86_64 > > All error/warnings (new ones prefixed by >>): > > net/bridge/br_netlink.c: In function 'br_port_info_size': >>> net/bridge/br_netlink.c:116:27: error: invalid application of 'sizeof' to incomplete type 'struct ifla_bridge_id' > + nla_total_size(sizeof(struct ifla_bridge_id)) /* IFLA_BRPORT_ROOT_ID */ > ^ > net/bridge/br_netlink.c: In function 'br_port_fill_attrs': > net/bridge/br_netlink.c:151:47: error: invalid application of 'sizeof' to incomplete type 'struct ifla_bridge_id' > nla_put(skb, IFLA_BRPORT_ROOT_ID, sizeof(struct ifla_bridge_id), > ^ > net/bridge/br_netlink.c: In function 'br_port_info_size': >>> net/bridge/br_netlink.c:118:1: warning: control reaches end of non-void function [-Wreturn-type] > } > ^This is incorrect, the structure is in net-next. My previous set introduced it: commit 5127c81f84de ("bridge: netlink: export root id") Cheers, Nik