-const char *dp_name(const struct datapath *dp)
-{
- return vport_get_name(rcu_dereference_rtnl(dp->ports[ODPP_LOCAL]));
-}
-
-static inline size_t br_nlmsg_size(void)
-{
- return NLMSG_ALIGN(sizeof(struct ifinfomsg))
- + nla_total_size(IFNAMSIZ) /* IFLA_IFNAME */
- + nla_total_size(MAX_ADDR_LEN) /* IFLA_ADDRESS */
- + nla_total_size(4) /* IFLA_MASTER */
- + nla_total_size(4) /* IFLA_MTU */
- + nla_total_size(4) /* IFLA_LINK */
- + nla_total_size(1); /* IFLA_OPERSTATE */
-}
-
-static int dp_fill_ifinfo(struct sk_buff *skb,
- const struct vport *port,
- int event, unsigned int flags)
-{
- struct datapath *dp = port->dp;
- int ifindex = vport_get_ifindex(port);
- int iflink = vport_get_iflink(port);
- struct ifinfomsg *hdr;
- struct nlmsghdr *nlh;
-
- if (ifindex < 0)
- return ifindex;
-
- if (iflink < 0)
- return iflink;
-
- nlh = nlmsg_put(skb, 0, 0, event, sizeof(*hdr), flags);
- if (nlh == NULL)
- return -EMSGSIZE;
-
- hdr = nlmsg_data(nlh);
- hdr->ifi_family = AF_BRIDGE;
- hdr->__ifi_pad = 0;
- hdr->ifi_type = ARPHRD_ETHER;
- hdr->ifi_index = ifindex;
- hdr->ifi_flags = vport_get_flags(port);
- hdr->ifi_change = 0;
-
- NLA_PUT_STRING(skb, IFLA_IFNAME, vport_get_name(port));
- NLA_PUT_U32(skb, IFLA_MASTER,
- vport_get_ifindex(get_vport_protected(dp, ODPP_LOCAL)));
- NLA_PUT_U32(skb, IFLA_MTU, vport_get_mtu(port));
-#ifdef IFLA_OPERSTATE
- NLA_PUT_U8(skb, IFLA_OPERSTATE,
- vport_is_running(port)
- ? vport_get_operstate(port)
- : IF_OPER_DOWN);
-#endif
-
- NLA_PUT(skb, IFLA_ADDRESS, ETH_ALEN, vport_get_addr(port));
-
- if (ifindex != iflink)
- NLA_PUT_U32(skb, IFLA_LINK,iflink);
-
- return nlmsg_end(skb, nlh);
-
-nla_put_failure:
- nlmsg_cancel(skb, nlh);
- return -EMSGSIZE;
-}
-
-static void dp_ifinfo_notify(int event, struct vport *port)
-{
- struct sk_buff *skb;
- int err = -ENOBUFS;
-
- skb = nlmsg_new(br_nlmsg_size(), GFP_KERNEL);
- if (skb == NULL)
- goto errout;
-
- err = dp_fill_ifinfo(skb, port, event, 0);
- if (err < 0) {
- /* -EMSGSIZE implies BUG in br_nlmsg_size() */
- WARN_ON(err == -EMSGSIZE);
- kfree_skb(skb);
- goto errout;
- }
- rtnl_notify(skb, &init_net, 0, RTNLGRP_LINK, NULL, GFP_KERNEL);
- return;
-errout:
- if (err < 0)
- rtnl_set_sk_err(&init_net, RTNLGRP_LINK, err);
-}
-
-static void release_dp(struct kobject *kobj)