1 #include <linux/skbuff.h>
2 #include <linux/netdevice.h>
3 #include <linux/if_vlan.h>
6 /* VLAN rx hw acceleration helper. This acts like netif_{rx,receive_skb}(). */
7 int __vlan_hwaccel_rx(struct sk_buff
*skb
, struct vlan_group
*grp
,
8 u16 vlan_tci
, int polling
)
10 struct net_device_stats
*stats
;
12 if (skb_bond_should_drop(skb
)) {
13 dev_kfree_skb_any(skb
);
17 skb
->dev
= vlan_group_get_device(grp
, vlan_tci
& VLAN_VID_MASK
);
18 if (skb
->dev
== NULL
) {
19 dev_kfree_skb_any(skb
);
20 /* Not NET_RX_DROP, this is not being dropped
21 * due to congestion. */
22 return NET_RX_SUCCESS
;
24 skb
->dev
->last_rx
= jiffies
;
26 stats
= &skb
->dev
->stats
;
28 stats
->rx_bytes
+= skb
->len
;
30 skb
->priority
= vlan_get_ingress_priority(skb
->dev
, vlan_tci
);
31 switch (skb
->pkt_type
) {
32 case PACKET_BROADCAST
:
34 case PACKET_MULTICAST
:
37 case PACKET_OTHERHOST
:
38 /* Our lower layer thinks this is not local, let's make sure.
39 * This allows the VLAN to have a different MAC than the
40 * underlying device, and still route correctly. */
41 if (!compare_ether_addr(eth_hdr(skb
)->h_dest
,
43 skb
->pkt_type
= PACKET_HOST
;
46 return (polling
? netif_receive_skb(skb
) : netif_rx(skb
));
48 EXPORT_SYMBOL(__vlan_hwaccel_rx
);
50 struct net_device
*vlan_dev_real_dev(const struct net_device
*dev
)
52 return vlan_dev_info(dev
)->real_dev
;
54 EXPORT_SYMBOL_GPL(vlan_dev_real_dev
);
56 u16
vlan_dev_vlan_id(const struct net_device
*dev
)
58 return vlan_dev_info(dev
)->vlan_id
;
60 EXPORT_SYMBOL_GPL(vlan_dev_vlan_id
);
This page took 0.060017 seconds and 5 git commands to generate.