On Mon, 2015-11-30 at 11:11 +0000, Anoob Soman wrote: > fcoemon tries to figure out sanmac, of an interface, before trying to start > VLAN discovery. This is done using a rtnl socket (with nl_groups set to > RTNLGRP_LINK) and RTM_GETDCB query to the kernel. Since nl_group is set to > RTNLGRP_LINK the receive handler also receives RTN_NEW_LINK multicast > notifcations and RTN_NEW_LINK notifications are wrongly considered as valid > repose to query. Since no valid sanmac is discovered, fcoemon fails to start > VLAN discovery on this interface. > > This is evident when running fcoemon on XenServer, as the interfaces resets > when they are added to the bridge. > > Ideally sanmac discovery doesn't require rtnl socket to be opened with > RTNLGRP_LINK and this would avoid receiving multicast notifications. > > Signed-off-by: Anoob Soman <[email protected]> > --- > fipvlan.c | 2 +- > include/rtnetlink.h | 2 +- > lib/rtnetlink.c | 6 +++--- > 3 files changed, 5 insertions(+), 5 deletions(-) > > diff --git a/fipvlan.c b/fipvlan.c > index 288b011..2059276 100644 > --- a/fipvlan.c > +++ b/fipvlan.c > @@ -979,7 +979,7 @@ int main(int argc, char **argv) > exit(1); > } > > - ns = rtnl_socket(); > + ns = rtnl_socket(RTMGRP_LINK); > if (ns < 0) { > rc = ns; > goto ns_err; > diff --git a/include/rtnetlink.h b/include/rtnetlink.h > index b4fd1c8..dfe781e 100644 > --- a/include/rtnetlink.h > +++ b/include/rtnetlink.h > @@ -20,7 +20,7 @@ > #ifndef _RTNETLINK_ > #define _RTNETLINK_ > > -int rtnl_socket(void); > +int rtnl_socket(unsigned int group); > typedef int rtnl_handler(struct nlmsghdr *nh, void *arg); > int rtnl_recv(int s, rtnl_handler *fn, void *arg); > ssize_t send_getlink_dump(int s); > diff --git a/lib/rtnetlink.c b/lib/rtnetlink.c > index 08552bf..3b84137 100644 > --- a/lib/rtnetlink.c > +++ b/lib/rtnetlink.c > @@ -52,11 +52,11 @@ > /** > * rtnl_socket - create and bind a routing netlink socket > */ > -int rtnl_socket(void) > +int rtnl_socket(unsigned int groups) > { > struct sockaddr_nl sa = { > .nl_family = AF_NETLINK, > - .nl_groups = RTMGRP_LINK, > + .nl_groups = groups, > }; > int s; > int rc; > @@ -507,7 +507,7 @@ int rtnl_get_sanmac(const char *ifname, unsigned char > *addr) > add_rtattr(nh, DCB_ATTR_IFNAME, (void *)ifname, strlen(ifname) + 1); > add_rtattr(nh, DCB_ATTR_PERM_HWADDR, NULL, 0); > > - s = rtnl_socket(); > + s = rtnl_socket(0); > if (s < 0) { > RTNL_LOG_ERRNO("failed to create the socket"); > return s;
Thanks for the patch, fixed a problem for one of my customers as well. Reviewed-by: Johannes Thumshirn <[email protected]> _______________________________________________ fcoe-devel mailing list [email protected] http://lists.open-fcoe.org/mailman/listinfo/fcoe-devel
