void netdev_txnotify(const uip_ipaddr_t *raddr) { /* Find the device driver that serves the subnet of the remote address */ struct uip_driver_s *dev = netdev_findbyaddr(raddr); /* The above lookup will fail if the packet is being sent out of our * out subnet to a router. REVISIT: For now, we fall back and try "eth0". */ if (dev == NULL) { /* If the destination address is not in our subnet, assume eth0 as the * default device. */ dev = netdev_findbyname("eth0"); } if (dev && dev->d_txavail) { /* Notify the device driver that new TX data is available. */ (void)dev->d_txavail(dev); } }
void netdev_txnotify(const uip_ipaddr_t *raddr) { /* Find the device driver that serves the subnet of the remote address */ struct uip_driver_s *dev = netdev_findbyaddr(raddr); if (dev && dev->d_txavail) { /* Notify the device driver that new TX data is available. */ (void)dev->d_txavail(dev); } }
int ieee80211_output(FAR struct ieee80211_s *ic, FAR struct iob_s *iob, FAR struct sockaddr *dst, uint8_t flags) { FAR struct uip_driver_s *dev; FAR struct ieee80211_frame *wh; FAR struct m_tag *mtag; uip_lock_t flags; int error = 0; /* Get the driver structure */ dev = netdev_findbyaddr(ic->ic_ifname); if (!dev) { error = -ENODEV; goto bad; } /* Interface has to be up and running */ if ((dev->d_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING)) { error = -ENETDOWN; goto bad; } /* Try to get the DLT from a buffer tag */ if ((mtag = m_tag_find(iob, PACKET_TAG_DLT, NULL)) != NULL) { unsigned int dlt = *(unsigned int *)(mtag + 1); /* Fallback to Ethernet for non-802.11 linktypes */ if (!(dlt == DLT_IEEE802_11 || dlt == DLT_IEEE802_11_RADIO)) { goto fallback; } if (iob->io_pktlen < sizeof(struct ieee80211_frame_min)) { return -EINVAL; } wh = (FAR struct ieee80211_frame *)IOB_DATA(iob); if ((wh->i_fc[0] & IEEE80211_FC0_VERSION_MASK) != IEEE80211_FC0_VERSION_0) { return -EINVAL; } if (!(ic->ic_caps & IEEE80211_C_RAWCTL) && (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) { return -EINVAL; } /* Queue message on interface without adding any further headers, and * start output if interface not yet active. */ flags = uip_lock(); error = ieee80211_ifsend(ic, iob, flags); if (error) { /* buffer is already freed */ uip_unlock(flags); ndbg("ERROR: %s: failed to queue raw tx frame\n", ic->ic_ifname); return error; } uip_unlock(flags); return error; } fallback: return ether_output(ic, iob, dst); bad: if (iob) { iob_free_chain(iob); } return error; }