static void wireless_nlevent_process(unsigned long data) { struct sk_buff *skb; while ((skb = skb_dequeue(&wireless_nlevent_queue))) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)) rtnl_notify(skb, &init_net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); #else rtnl_notify(skb, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); #endif }
/* * Notify listeners of a change in port information */ void br_ifinfo_notify(int event, struct net_bridge_port *port) { struct net *net; struct sk_buff *skb; int err = -ENOBUFS; if (!port) return; net = dev_net(port->dev); br_debug(port->br, "port %u(%s) event %d\n", (unsigned int)port->port_no, port->dev->name, event); skb = nlmsg_new(br_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; err = br_fill_ifinfo(skb, port, 0, 0, event, 0, 0, port->dev); if (err < 0) { /* -EMSGSIZE implies BUG in br_nlmsg_size() */ WARN_ON(err == -EMSGSIZE); kfree_skb(skb); goto errout; } rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); return; errout: if (err < 0) rtnl_set_sk_err(net, RTNLGRP_LINK, err); }
static void wireless_nlevent_process(unsigned long data) { struct sk_buff *skb; while ((skb = skb_dequeue(&wireless_nlevent_queue))) rtnl_notify(skb, &init_net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); }
/* Caller must hold RTNL lock. */ static void dp_ifinfo_notify(int event, struct vport *port) { struct sk_buff *skb; int err; skb = nlmsg_new(br_nlmsg_size(), GFP_KERNEL); if (!skb) { err = -ENOBUFS; goto err; } err = dp_fill_ifinfo(skb, port, event, 0); if (err < 0) { if (err == -ENODEV) { goto out; } else { /* -EMSGSIZE implies BUG in br_nlmsg_size() */ WARN_ON(err == -EMSGSIZE); goto err; } } rtnl_notify(skb, &init_net, 0, RTNLGRP_LINK, NULL, GFP_KERNEL); return; err: rtnl_set_sk_err(&init_net, RTNLGRP_LINK, err); out: kfree_skb(skb); }
static void wireless_nlevent_flush(void) { struct sk_buff *skb; struct net *net; ASSERT_RTNL(); for_each_net(net) { while ((skb = skb_dequeue(&net->wext_nlevents))) rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_KERNEL); } }
a_status_t acfg_net_indicate_event(struct net_device *dev, acfg_os_event_t *event, int send_iwevent) { struct sk_buff *skb; int err; __acfg_event_t fn; #if LINUX_VERSION_CODE >= KERNEL_VERSION (2,6,24) if (!net_eq(dev_net(dev), &init_net)) return A_STATUS_FAILED ; #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION (2,6,24) skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); #else skb = nlmsg_new(NLMSG_SPACE(ACFG_MAX_PAYLOAD)); #endif if (!skb) return A_STATUS_ENOMEM ; err = ev_fill_info(skb, dev, RTM_NEWLINK, event); if (err < 0) { kfree_skb(skb); return A_STATUS_FAILED ; } NETLINK_CB(skb).dst_group = RTNLGRP_LINK; #if ATOPT_ORI_ATHEROS_BUG NETLINK_CB(skb).portid = 0; /* from kernel */ #else NETLINK_CB(skb).pid = 0; /* from kernel */ #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) NETLINK_CB(skb).dst_pid = 0; /* multicast */ #endif /* Send event to acfg */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) err = nlmsg_multicast(acfg_ev_sock, skb, 0, RTNLGRP_NOTIFY); #else rtnl_notify(skb, &init_net, 0, RTNLGRP_NOTIFY, NULL, GFP_ATOMIC); #endif if (send_iwevent) { /* Send iw event */ fn = iw_events[event->id]; if (fn != NULL) { fn(dev, &event->data); } } return A_STATUS_OK ; }
/* Process events generated by the wireless layer or the driver. */ static void wireless_nlevent_process(struct work_struct *work) { struct sk_buff *skb; struct net *net; rtnl_lock(); for_each_net(net) { while ((skb = skb_dequeue(&net->wext_nlevents))) rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_KERNEL); } rtnl_unlock(); }
/* * Notify listeners of a change in port information */ void br_ifinfo_notify(int event, struct net_bridge_port *port) { struct sk_buff *skb; int err = -ENOBUFS; pr_debug("bridge notify event=%d\n", event); skb = nlmsg_new(br_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; err = br_fill_ifinfo(skb, port, 0, 0, event, 0); /* failure implies BUG in br_nlmsg_size() */ BUG_ON(err < 0); err = rtnl_notify(skb, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); errout: if (err < 0) rtnl_set_sk_err(RTNLGRP_LINK, err); }
/** * @brief Indicate the ACFG Eevnt to the upper layer * * @param hdl * @param event * * @return */ a_status_t __adf_net_indicate_event(adf_net_handle_t hdl, void *vevent) { struct net_device *dev = NULL; struct sk_buff *skb; int err; acfg_os_event_t *event = (acfg_os_event_t *) vevent; __adf_softc_t *sc = NULL ; __adf_event_t fn; adf_trace(ADF_DEBUG_FUNCTRACE,"ADF EVENT Received : id - %d \n",event->id); if(hdl != NULL) { dev = hdl_to_netdev(hdl); if (!net_eq(dev_net(dev), &init_net)) return A_STATUS_FAILED ; } skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); if (!skb) return A_STATUS_ENOMEM ; err = ev_fill_info(skb, dev, RTM_NEWLINK, event); if (err < 0) { kfree_skb(skb); return A_STATUS_FAILED ; } NETLINK_CB(skb).dst_group = RTNLGRP_LINK; /* Send event to acfg */ rtnl_notify(skb, &init_net, 0, RTNLGRP_NOTIFY, NULL, GFP_ATOMIC); /* Send iw event */ if(hdl != NULL) { sc = hdl_to_softc(hdl); fn = iw_events[event->id]; fn(sc, &event->data); } return A_STATUS_OK ; }
void rtmsg_ifinfo(int type, struct net_device *dev, unsigned change) { struct sk_buff *skb; int err = -ENOBUFS; skb = nlmsg_new(if_nlmsg_size(), GFP_KERNEL); if (skb == NULL) goto errout; err = rtnl_fill_ifinfo(skb, dev, type, 0, 0, change, 0); if (err < 0) { /* -EMSGSIZE implies BUG in if_nlmsg_size() */ WARN_ON(err == -EMSGSIZE); kfree_skb(skb); goto errout; } err = rtnl_notify(skb, 0, RTNLGRP_LINK, NULL, GFP_KERNEL); errout: if (err < 0) rtnl_set_sk_err(RTNLGRP_LINK, err); }
/* * Notify listeners of a change in port information */ void br_ifinfo_notify(int event, struct net_bridge_port *port) { struct net *net = dev_net(port->dev); struct sk_buff *skb; int err = -ENOBUFS; pr_debug("bridge notify event=%d\n", event); skb = nlmsg_new(br_nlmsg_size(), GFP_ATOMIC); if (skb == NULL) goto errout; err = br_fill_ifinfo(skb, port, 0, 0, event, 0); if (err < 0) { /* -EMSGSIZE implies BUG in br_nlmsg_size() */ WARN_ON(err == -EMSGSIZE); kfree_skb(skb); goto errout; } err = rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); errout: if (err < 0) rtnl_set_sk_err(net, RTNLGRP_LINK, err); }