/* Caller must leave room for ethernet header in front!! */ ssize_t sendether(struct iodesc *d, void *pkt, size_t len, u_char *dea, int etype) { ssize_t n; struct ether_header *eh; #ifdef ETHER_DEBUG if (debug) printf("sendether: called\n"); #endif eh = (struct ether_header *)pkt - 1; len += sizeof(*eh); MACPY(d->myea, eh->ether_shost); /* by byte */ MACPY(dea, eh->ether_dhost); /* by byte */ eh->ether_type = htons(etype); n = netif_put(d, eh, len); if (n == -1 || (size_t)n < sizeof(*eh)) return -1; n -= sizeof(*eh); return n; }
void netif_disconnect(netif_t *netif) { switch (netif->status) { case CONNECTED: rtnl_lock(); netif->status = DISCONNECTING; wmb(); if (netif_running(netif->dev)) __netif_down(netif); rtnl_unlock(); netif_put(netif); /* fall through */ case DISCONNECTED: netif_free(netif); break; default: BUG(); } }
static void net_tx_error(struct XenNetDev *netdev, netif_tx_request_t *txp, RING_IDX end) { #if 0 /* * Hmm, why netback fails everything in the ring? * Should we do that even when not supporting SG and TSO? */ RING_IDX cons = netdev->tx_ring.req_cons; do { make_tx_response(netif, txp, NETIF_RSP_ERROR); if (cons >= end) break; txp = RING_GET_REQUEST(&netdev->tx_ring, cons++); } while (1); netdev->tx_ring.req_cons = cons; netif_schedule_work(netif); netif_put(netif); #else net_tx_response(netdev, txp, NETIF_RSP_ERROR); #endif }