/* Replacement for the driver ndo_start_xmit() method. * When this function is invoked because of the dev_queue_xmit() call * in generic_xmit_frame() (e.g. because of a txsync on the NIC), we have * to call the original ndo_start_xmit() method. * In all the other cases (e.g. when the TX request comes from the network * stack) we intercept the packet and put it into the RX ring associated * to the host stack. */ static netdev_tx_t generic_ndo_start_xmit(struct mbuf *m, struct ifnet *ifp) { struct netmap_generic_adapter *gna = (struct netmap_generic_adapter *)NA(ifp); if (likely(m->priority == NM_MAGIC_PRIORITY_TX)) return gna->save_start_xmit(m, ifp); /* To the driver. */ /* To a netmap RX ring. */ return linux_netmap_start_xmit(m, ifp); }
/* Replacement for the driver ndo_start_xmit() method. * When this function is invoked because of the dev_queue_xmit() call * in generic_xmit_frame() (e.g. because of a txsync on the NIC), we have * to call the original ndo_start_xmit() method. * In all the other cases (e.g. when the TX request comes from the network * stack) we intercept the packet and put it into the RX ring associated * to the host stack. */ static netdev_tx_t generic_ndo_start_xmit(struct mbuf *m, struct ifnet *ifp) { struct netmap_generic_adapter *gna = (struct netmap_generic_adapter *)NA(ifp); if (likely(m->priority == NM_MAGIC_PRIORITY_TX)) { /* Reset priority, so that generic_netmap_tx_clean() * knows that it can reclaim this mbuf. */ m->priority = 0; return gna->save_start_xmit(m, ifp); /* To the driver. */ } /* To a netmap RX ring. */ return linux_netmap_start_xmit(m, ifp); }