size_t pfq_skb_pool_flush(struct pfq_skb_pool *pool) { size_t n, total = 0; for(n = 0; n < pool->size; n++) { if (pool->skbs[n]) { total++; SPARSE_INC(&memory_stats.os_free); kfree_skb(pool->skbs[n]); pool->skbs[n] = NULL; } } pool->p_idx = 0; pool->c_idx = 0; return total; }
struct sk_buff * pfq_vlan_untag(struct sk_buff *skb) { struct vlan_hdr *vhdr; u16 vlan_tci; if (unlikely(vlan_tx_tag_present(skb))) { /* vlan_tci is already set-up so leave this for another time */ return skb; } if (unlikely(!pskb_may_pull(skb, VLAN_HLEN))) goto err_free; vhdr = (struct vlan_hdr *) skb->data; vlan_tci = ntohs(vhdr->h_vlan_TCI); __vlan_hwaccel_put_tag(skb, vlan_tci); skb_pull_rcsum(skb, VLAN_HLEN); pfq_vlan_set_encap_proto(skb, vhdr); skb = pfq_vlan_reorder_header(skb); if (unlikely(!skb)) goto err_free; skb_reset_network_header(skb); skb_reset_transport_header(skb); return skb; err_free: SPARSE_INC(&memory_stats.os_free); kfree_skb(skb); return NULL; }