On Wed, 24 May 2006 14:11:55 -0400
jamal <[EMAIL PROTECTED]> wrote:

> 
> Very nice.
> 
> On Wed, 2006-24-05 at 10:12 -0700, Stephen Hemminger wrote:
> > plain text document attachment (bridge-netlink.patch)
> > Add basic netlink support to the Ethernet bridge. Including:
> >  * dump interfaces in bridges
> >  * monitor link status changes
> >  * change state of bridge port
> 
> 
> > +static int br_fill_ifinfo(struct sk_buff *skb, const struct 
> > net_bridge_port *port,
> > +                     u32 pid, u32 seq, int event, unsigned int flags)
> > +{
> > +   const struct net_bridge *br = port->br;
> > +   const struct net_device *dev = port->dev;
> > +   struct ifinfomsg *r;
> > +   struct nlmsghdr *nlh;
> > +   unsigned char *b = skb->tail;
> > +   u32 mtu = dev->mtu;
> > +   u8 operstate = netif_running(dev) ? dev->operstate : IF_OPER_DOWN;
> > +   u8 portstate = port->state;
> > +
> > +   pr_debug("br_fill_info event %d port %s master %s\n",
> > +            event, dev->name, br->dev->name);
> > +
> > +   nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*r), flags);
> > +   r = NLMSG_DATA(nlh);
> > +   r->ifi_family = AF_BRIDGE;
> > +   r->__ifi_pad = 0;
> > +   r->ifi_type = dev->type;
> > +   r->ifi_index = dev->ifindex;
> > +   r->ifi_flags = dev_get_flags(dev);
> > +   r->ifi_change = 0;
> > +
> > +   RTA_PUT(skb, IFLA_IFNAME, strlen(dev->name)+1, dev->name);
> > +
> > +   RTA_PUT(skb, IFLA_MASTER, sizeof(int), &br->dev->ifindex);
> > +
> > +   if (dev->addr_len)
> > +           RTA_PUT(skb, IFLA_ADDRESS, dev->addr_len, dev->dev_addr);
> > +
> > +   RTA_PUT(skb, IFLA_MTU, sizeof(mtu), &mtu);
> > +   if (dev->ifindex != dev->iflink)
> > +           RTA_PUT(skb, IFLA_LINK, sizeof(int), &dev->iflink);
> > +
> > +
> > +   RTA_PUT(skb, IFLA_OPERSTATE, sizeof(operstate), &operstate);
> > +
> > +   if (event == RTM_NEWLINK)
> > +           RTA_PUT(skb, IFLA_PROTINFO, sizeof(portstate), &portstate);
> > +
> > +   nlh->nlmsg_len = skb->tail - b;
> > +
> > +   return skb->len;
> > +
> 
> Is it desirable to do the above? link events already happen for each
> netdevice, no? If not it would probably make more sense to export the
> link netlink code (instead of replicating it as above) and just call it
> for each netdevice.

The STP daemon only wants to know about interfaces in bridge, and it needs
to know the bridge port state.

> I think it is worth reporting all the children (their ifindices) of a
> bridge when eventing.

can easily track this in daemon.


> BTW, Where is the bridge state (as in learning, blocking etc) carried? 

In IFLA_PROTINFO

> Having events for that i would deem as valuable.
> 
> > +static int br_rtm_setlink(struct sk_buff *skb,  struct nlmsghdr *nlh, void 
> > *arg)
> > +{
> > +   struct rtattr  **rta = arg;
> > +   struct ifinfomsg *ifm = NLMSG_DATA(nlh);
> > +   struct net_device *dev;
> > +   struct net_bridge_port *p;
> > +   u8 new_state;
> > +
> > +   if (ifm->ifi_family != AF_BRIDGE)
> > +           return -EPFNOSUPPORT;
> > +
> > +   /* Must pass valid state as PROTINFO */
> > +   if (rta[IFLA_PROTINFO-1]) {
> 
> Why not a noun like IFLA_BRIDGE_STATE ?

Laziness.  Just used "protocol specific portion"

> 
> 
> > +   /* if kernel STP is running, don't allow changes */
> > +   if (p->br->stp_enabled)
> > +           return -EBUSY;
> 
> Hopefully above to die some day...
> 
> > +
> > +   p->state = new_state;
> > +   br_log_state(p);
> 
> Assuming the above will generate an event which reports things like the
> children of the bridge and the STP state of the bridge etc i.e things in
> struct net_bridge_port mostly.


The br_log_state just does console printk's.  
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to