Blame view
net/dsa/tag_trailer.c
2.08 KB
dfedd3b62 dsa: Add SPDX hea... |
1 |
// SPDX-License-Identifier: GPL-2.0+ |
396138f03 dsa: add support ... |
2 3 |
/* * net/dsa/tag_trailer.c - Trailer tag format handling |
e84665c9c dsa: add switch c... |
4 |
* Copyright (c) 2008-2009 Marvell Semiconductor |
396138f03 dsa: add support ... |
5 6 7 8 |
*/ #include <linux/etherdevice.h> #include <linux/list.h> |
5a0e3ad6a include cleanup: ... |
9 |
#include <linux/slab.h> |
ea5dd34be net: dsa: include... |
10 |
|
396138f03 dsa: add support ... |
11 |
#include "dsa_priv.h" |
4ed70ce9f net: dsa: Refacto... |
12 |
static struct sk_buff *trailer_xmit(struct sk_buff *skb, struct net_device *dev) |
396138f03 dsa: add support ... |
13 |
{ |
d945097bb net: dsa: add sla... |
14 |
struct dsa_port *dp = dsa_slave_to_port(dev); |
396138f03 dsa: add support ... |
15 16 17 |
struct sk_buff *nskb; int padlen; u8 *trailer; |
396138f03 dsa: add support ... |
18 19 20 21 22 23 24 25 26 27 28 |
/* * We have to make sure that the trailer ends up as the very * last 4 bytes of the packet. This means that we have to pad * the packet to the minimum ethernet frame size, if necessary, * before adding the trailer. */ padlen = 0; if (skb->len < 60) padlen = 60 - skb->len; nskb = alloc_skb(NET_IP_ALIGN + skb->len + padlen + 4, GFP_ATOMIC); |
fe47d5630 net: dsa: factor ... |
29 |
if (!nskb) |
4ed70ce9f net: dsa: Refacto... |
30 |
return NULL; |
396138f03 dsa: add support ... |
31 32 33 34 35 36 |
skb_reserve(nskb, NET_IP_ALIGN); skb_reset_mac_header(nskb); skb_set_network_header(nskb, skb_network_header(skb) - skb->head); skb_set_transport_header(nskb, skb_transport_header(skb) - skb->head); skb_copy_and_csum_dev(skb, skb_put(nskb, skb->len)); |
2b33bc8aa net: dsa: use con... |
37 |
consume_skb(skb); |
396138f03 dsa: add support ... |
38 39 |
if (padlen) { |
b952f4dff net: manual clean... |
40 |
skb_put_zero(nskb, padlen); |
396138f03 dsa: add support ... |
41 42 43 44 |
} trailer = skb_put(nskb, 4); trailer[0] = 0x80; |
d945097bb net: dsa: add sla... |
45 |
trailer[1] = 1 << dp->index; |
396138f03 dsa: add support ... |
46 47 |
trailer[2] = 0x10; trailer[3] = 0x00; |
4ed70ce9f net: dsa: Refacto... |
48 |
return nskb; |
396138f03 dsa: add support ... |
49 |
} |
a86d8becc net: dsa: Factor ... |
50 |
static struct sk_buff *trailer_rcv(struct sk_buff *skb, struct net_device *dev, |
89e49506b dsa: remove unuse... |
51 |
struct packet_type *pt) |
396138f03 dsa: add support ... |
52 |
{ |
396138f03 dsa: add support ... |
53 54 |
u8 *trailer; int source_port; |
396138f03 dsa: add support ... |
55 |
if (skb_linearize(skb)) |
547097958 net: dsa: remove ... |
56 |
return NULL; |
396138f03 dsa: add support ... |
57 58 59 |
trailer = skb_tail_pointer(skb) - 4; if (trailer[0] != 0x80 || (trailer[1] & 0xf8) != 0x00 || |
fbd03513b net: dsa: Fix Mar... |
60 |
(trailer[2] & 0xef) != 0x00 || trailer[3] != 0x00) |
547097958 net: dsa: remove ... |
61 |
return NULL; |
396138f03 dsa: add support ... |
62 63 |
source_port = trailer[1] & 7; |
3775b1b7f net: dsa: add mas... |
64 |
|
2231c43b5 net: dsa: rename ... |
65 |
skb->dev = dsa_master_find_slave(dev, 0, source_port); |
3775b1b7f net: dsa: add mas... |
66 |
if (!skb->dev) |
547097958 net: dsa: remove ... |
67 |
return NULL; |
396138f03 dsa: add support ... |
68 |
|
349b71d6f net: dsa: add err... |
69 70 |
if (pskb_trim_rcsum(skb, skb->len - 4)) return NULL; |
396138f03 dsa: add support ... |
71 |
|
a86d8becc net: dsa: Factor ... |
72 |
return skb; |
396138f03 dsa: add support ... |
73 |
} |
f81a43e8d dsa: Cleanup unne... |
74 |
static const struct dsa_device_ops trailer_netdev_ops = { |
875138f81 dsa: Move tagger ... |
75 |
.name = "trailer", |
056eed2fb dsa: Add TAG prot... |
76 |
.proto = DSA_TAG_PROTO_TRAILER, |
3e8a72d1d net: dsa: reduce ... |
77 78 |
.xmit = trailer_xmit, .rcv = trailer_rcv, |
a5dd30877 net: dsa: Add ove... |
79 |
.overhead = 4, |
396138f03 dsa: add support ... |
80 |
}; |
0b42f0336 dsa: Add MODULE_A... |
81 |
|
f18bba50d dsa: Add MODULE_L... |
82 |
MODULE_LICENSE("GPL"); |
0b42f0336 dsa: Add MODULE_A... |
83 |
MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_TRAILER); |
d3b8c0498 dsa: Add boilerpl... |
84 85 |
module_dsa_tag_driver(trailer_netdev_ops); |