brcompat: Simplify generation of bridge ID.
authorJesse Gross <jesse@nicira.com>
Sat, 4 Dec 2010 23:17:56 +0000 (15:17 -0800)
committerJesse Gross <jesse@nicira.com>
Fri, 10 Dec 2010 01:43:36 +0000 (17:43 -0800)
Currently we use a fairly complicated method of generating the
bridge ID, since the actual struct is only available in a header
file private to the Linux bridge.  The current method appears to
be correct but is difficult to reason about.  This replaces it
with a simple memcpy, which is more analogous to what the Linux
bridge does.

Flagged by sparse.

Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
datapath/brcompat.c

index 2113eae..f23db93 100644 (file)
@@ -224,14 +224,13 @@ static int brc_get_bridge_info(struct net_device *dev,
                               struct __bridge_info __user *ub)
 {
        struct __bridge_info b;
-       u64 id = 0;
-       int i;
 
        memset(&b, 0, sizeof(struct __bridge_info));
 
-       for (i=0; i<ETH_ALEN; i++)
-               id |= (u64)dev->dev_addr[i] << (8*(ETH_ALEN-1 - i));
-       b.bridge_id = cpu_to_be64(id);
+       /* First two bytes are the priority, which we should skip.  This comes
+        * from struct bridge_id in br_private.h, which is unavailable to us.
+        */
+       memcpy((u8 *)&b.bridge_id + 2, dev->dev_addr, ETH_ALEN);
        b.stp_enabled = 0;
 
        if (copy_to_user(ub, &b, sizeof(struct __bridge_info)))