static netdev_tx_t skfp_send_pkt(struct sk_buff *skb, struct net_device *dev) { struct s_smc *smc = netdev_priv(dev); skfddi_priv *bp = &smc->os; pr_debug(KERN_INFO "skfp_send_pkt\n"); if (!(skb->len >= FDDI_K_LLC_ZLEN && skb->len <= FDDI_K_LLC_LEN)) { bp->MacStat.gen.tx_errors++; netif_start_queue(dev); dev_kfree_skb(skb); return NETDEV_TX_OK; } if (bp->QueueSkb == 0) { netif_stop_queue(dev); return NETDEV_TX_BUSY; } bp->QueueSkb--; skb_queue_tail(&bp->SendSkbQueue, skb); send_queued_packets(netdev_priv(dev)); if (bp->QueueSkb == 0) { netif_stop_queue(dev); } dev->trans_start = jiffies; return NETDEV_TX_OK; }
void llc_restart_tx(struct s_smc *smc) { skfddi_priv *bp = &smc->os; pr_debug(KERN_INFO "[llc_restart_tx]\n"); spin_unlock(&bp->DriverLock); send_queued_packets(smc); spin_lock(&bp->DriverLock); netif_start_queue(bp->dev); }
void process_arp_reply( struct sr_instance *sr, const uint8_t *packet, unsigned int len, const char *interface) { assert(sr); assert(packet); assert(interface); router_state *rs = get_router_state(sr); /* update the arp cache */ arp_hdr *arp = get_arp_hdr(packet, len); lock_arp_cache_wr(rs); update_arp_cache(sr, &(arp->arp_sip), arp->arp_sha, 0); unlock_arp_cache(rs); lock_arp_cache_rd(rs); lock_arp_queue_wr(rs); send_queued_packets(sr, &(arp->arp_sip), arp->arp_sha); unlock_arp_queue(rs); unlock_arp_cache(rs); }