static int rtmac_vnic_xmit(struct sk_buff *skb, struct net_device *dev) { struct rtnet_device *rtdev = (struct rtnet_device*)dev->priv; struct net_device_stats *stats = &rtdev->mac_priv->vnic_stats; struct rtskb_queue *pool = &rtdev->mac_priv->vnic_skb_pool; struct ethhdr *ethernet = (struct ethhdr*)skb->data; struct rtskb *rtskb; int res; int data_len; rtskb = alloc_rtskb((skb->len + sizeof(struct rtmac_hdr) + 15) & ~15, pool); if (!rtskb) { stats->tx_dropped++; return -ENOMEM; } rtskb_reserve(rtskb, rtdev->hard_header_len + sizeof(struct rtmac_hdr)); data_len = skb->len - dev->hard_header_len; memcpy(rtskb_put(rtskb, data_len), skb->data + dev->hard_header_len, data_len); res = rtmac_add_header(rtdev, ethernet->h_dest, rtskb, ntohs(ethernet->h_proto)); if (res < 0) { stats->tx_dropped++; kfree_rtskb(rtskb); return res; } RTNET_ASSERT(rtdev->mac_disc->nrt_packet_tx != NULL, kfree_rtskb(rtskb); return -1;);
int rtmac_vnic_xmit(struct sk_buff *skb, struct net_device *dev) { struct rtnet_device *rtdev = *(struct rtnet_device **)netdev_priv(dev); struct net_device_stats *stats = &rtdev->mac_priv->vnic_stats; struct rtskb_pool *pool = &rtdev->mac_priv->vnic_skb_pool; struct ethhdr *ethernet = (struct ethhdr*)skb->data; struct rtskb *rtskb; int res; int data_len; rtskb = alloc_rtskb((skb->len + sizeof(struct rtmac_hdr) + 15) & ~15, pool); if (!rtskb) return NETDEV_TX_BUSY; rtskb_reserve(rtskb, rtdev->hard_header_len + sizeof(struct rtmac_hdr)); data_len = skb->len - dev->hard_header_len; memcpy(rtskb_put(rtskb, data_len), skb->data + dev->hard_header_len, data_len); res = rtmac_add_header(rtdev, ethernet->h_dest, rtskb, ntohs(ethernet->h_proto), RTMAC_FLAG_TUNNEL); if (res < 0) { stats->tx_dropped++; kfree_rtskb(rtskb); goto done; } RTNET_ASSERT(rtdev->mac_disc->nrt_packet_tx != NULL, kfree_rtskb(rtskb); goto done;);