Skip to content

Commit f191a1d

Browse files
Vlad Yasevichdavem330
authored andcommitted
net: Remove code duplication between offload structures
Move the offload callbacks into its own structure. Signed-off-by: Vlad Yasevich <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c6b641a commit f191a1d

File tree

7 files changed

+66
-54
lines changed

7 files changed

+66
-54
lines changed

include/linux/netdevice.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,15 +1515,19 @@ struct packet_type {
15151515
struct list_head list;
15161516
};
15171517

1518-
struct packet_offload {
1519-
__be16 type; /* This is really htons(ether_type). */
1518+
struct offload_callbacks {
15201519
struct sk_buff *(*gso_segment)(struct sk_buff *skb,
15211520
netdev_features_t features);
15221521
int (*gso_send_check)(struct sk_buff *skb);
15231522
struct sk_buff **(*gro_receive)(struct sk_buff **head,
15241523
struct sk_buff *skb);
15251524
int (*gro_complete)(struct sk_buff *skb);
1526-
struct list_head list;
1525+
};
1526+
1527+
struct packet_offload {
1528+
__be16 type; /* This is really htons(ether_type). */
1529+
struct offload_callbacks callbacks;
1530+
struct list_head list;
15271531
};
15281532

15291533
#include <linux/notifier.h>

include/net/protocol.h

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#if IS_ENABLED(CONFIG_IPV6)
3030
#include <linux/ipv6.h>
3131
#endif
32+
#include <linux/netdevice.h>
3233

3334
/* This is one larger than the largest protocol value that can be
3435
* found in an ipv4 or ipv6 header. Since in both cases the protocol
@@ -63,13 +64,8 @@ struct inet6_protocol {
6364
#endif
6465

6566
struct net_offload {
66-
int (*gso_send_check)(struct sk_buff *skb);
67-
struct sk_buff *(*gso_segment)(struct sk_buff *skb,
68-
netdev_features_t features);
69-
struct sk_buff **(*gro_receive)(struct sk_buff **head,
70-
struct sk_buff *skb);
71-
int (*gro_complete)(struct sk_buff *skb);
72-
unsigned int flags; /* Flags used by IPv6 for now */
67+
struct offload_callbacks callbacks;
68+
unsigned int flags; /* Flags used by IPv6 for now */
7369
};
7470
/* This should be set for any extension header which is compatible with GSO. */
7571
#define INET6_PROTO_GSO_EXTHDR 0x1

net/core/dev.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2102,16 +2102,16 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb,
21022102

21032103
rcu_read_lock();
21042104
list_for_each_entry_rcu(ptype, &offload_base, list) {
2105-
if (ptype->type == type && ptype->gso_segment) {
2105+
if (ptype->type == type && ptype->callbacks.gso_segment) {
21062106
if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) {
2107-
err = ptype->gso_send_check(skb);
2107+
err = ptype->callbacks.gso_send_check(skb);
21082108
segs = ERR_PTR(err);
21092109
if (err || skb_gso_ok(skb, features))
21102110
break;
21112111
__skb_push(skb, (skb->data -
21122112
skb_network_header(skb)));
21132113
}
2114-
segs = ptype->gso_segment(skb, features);
2114+
segs = ptype->callbacks.gso_segment(skb, features);
21152115
break;
21162116
}
21172117
}
@@ -3533,10 +3533,10 @@ static int napi_gro_complete(struct sk_buff *skb)
35333533

35343534
rcu_read_lock();
35353535
list_for_each_entry_rcu(ptype, head, list) {
3536-
if (ptype->type != type || !ptype->gro_complete)
3536+
if (ptype->type != type || !ptype->callbacks.gro_complete)
35373537
continue;
35383538

3539-
err = ptype->gro_complete(skb);
3539+
err = ptype->callbacks.gro_complete(skb);
35403540
break;
35413541
}
35423542
rcu_read_unlock();
@@ -3598,7 +3598,7 @@ enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
35983598

35993599
rcu_read_lock();
36003600
list_for_each_entry_rcu(ptype, head, list) {
3601-
if (ptype->type != type || !ptype->gro_receive)
3601+
if (ptype->type != type || !ptype->callbacks.gro_receive)
36023602
continue;
36033603

36043604
skb_set_network_header(skb, skb_gro_offset(skb));
@@ -3608,7 +3608,7 @@ enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
36083608
NAPI_GRO_CB(skb)->flush = 0;
36093609
NAPI_GRO_CB(skb)->free = 0;
36103610

3611-
pp = ptype->gro_receive(&napi->gro_list, skb);
3611+
pp = ptype->callbacks.gro_receive(&napi->gro_list, skb);
36123612
break;
36133613
}
36143614
rcu_read_unlock();

net/ipv4/af_inet.c

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,8 +1276,8 @@ static int inet_gso_send_check(struct sk_buff *skb)
12761276

12771277
rcu_read_lock();
12781278
ops = rcu_dereference(inet_offloads[proto]);
1279-
if (likely(ops && ops->gso_send_check))
1280-
err = ops->gso_send_check(skb);
1279+
if (likely(ops && ops->callbacks.gso_send_check))
1280+
err = ops->callbacks.gso_send_check(skb);
12811281
rcu_read_unlock();
12821282

12831283
out:
@@ -1326,8 +1326,8 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
13261326

13271327
rcu_read_lock();
13281328
ops = rcu_dereference(inet_offloads[proto]);
1329-
if (likely(ops && ops->gso_segment))
1330-
segs = ops->gso_segment(skb, features);
1329+
if (likely(ops && ops->callbacks.gso_segment))
1330+
segs = ops->callbacks.gso_segment(skb, features);
13311331
rcu_read_unlock();
13321332

13331333
if (!segs || IS_ERR(segs))
@@ -1379,7 +1379,7 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head,
13791379

13801380
rcu_read_lock();
13811381
ops = rcu_dereference(inet_offloads[proto]);
1382-
if (!ops || !ops->gro_receive)
1382+
if (!ops || !ops->callbacks.gro_receive)
13831383
goto out_unlock;
13841384

13851385
if (*(u8 *)iph != 0x45)
@@ -1420,7 +1420,7 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head,
14201420
skb_gro_pull(skb, sizeof(*iph));
14211421
skb_set_transport_header(skb, skb_gro_offset(skb));
14221422

1423-
pp = ops->gro_receive(head, skb);
1423+
pp = ops->callbacks.gro_receive(head, skb);
14241424

14251425
out_unlock:
14261426
rcu_read_unlock();
@@ -1444,10 +1444,10 @@ static int inet_gro_complete(struct sk_buff *skb)
14441444

14451445
rcu_read_lock();
14461446
ops = rcu_dereference(inet_offloads[proto]);
1447-
if (WARN_ON(!ops || !ops->gro_complete))
1447+
if (WARN_ON(!ops || !ops->callbacks.gro_complete))
14481448
goto out_unlock;
14491449

1450-
err = ops->gro_complete(skb);
1450+
err = ops->callbacks.gro_complete(skb);
14511451

14521452
out_unlock:
14531453
rcu_read_unlock();
@@ -1563,10 +1563,12 @@ static const struct net_protocol tcp_protocol = {
15631563
};
15641564

15651565
static const struct net_offload tcp_offload = {
1566-
.gso_send_check = tcp_v4_gso_send_check,
1567-
.gso_segment = tcp_tso_segment,
1568-
.gro_receive = tcp4_gro_receive,
1569-
.gro_complete = tcp4_gro_complete,
1566+
.callbacks = {
1567+
.gso_send_check = tcp_v4_gso_send_check,
1568+
.gso_segment = tcp_tso_segment,
1569+
.gro_receive = tcp4_gro_receive,
1570+
.gro_complete = tcp4_gro_complete,
1571+
},
15701572
};
15711573

15721574
static const struct net_protocol udp_protocol = {
@@ -1577,8 +1579,10 @@ static const struct net_protocol udp_protocol = {
15771579
};
15781580

15791581
static const struct net_offload udp_offload = {
1580-
.gso_send_check = udp4_ufo_send_check,
1581-
.gso_segment = udp4_ufo_fragment,
1582+
.callbacks = {
1583+
.gso_send_check = udp4_ufo_send_check,
1584+
.gso_segment = udp4_ufo_fragment,
1585+
},
15821586
};
15831587

15841588
static const struct net_protocol icmp_protocol = {
@@ -1667,10 +1671,12 @@ static int ipv4_proc_init(void);
16671671

16681672
static struct packet_offload ip_packet_offload __read_mostly = {
16691673
.type = cpu_to_be16(ETH_P_IP),
1670-
.gso_send_check = inet_gso_send_check,
1671-
.gso_segment = inet_gso_segment,
1672-
.gro_receive = inet_gro_receive,
1673-
.gro_complete = inet_gro_complete,
1674+
.callbacks = {
1675+
.gso_send_check = inet_gso_send_check,
1676+
.gso_segment = inet_gso_segment,
1677+
.gro_receive = inet_gro_receive,
1678+
.gro_complete = inet_gro_complete,
1679+
},
16741680
};
16751681

16761682
static int __init ipv4_offload_init(void)

net/ipv6/ip6_offload.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ static int ipv6_gso_send_check(struct sk_buff *skb)
7070
ops = rcu_dereference(inet6_offloads[
7171
ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr)]);
7272

73-
if (likely(ops && ops->gso_send_check)) {
73+
if (likely(ops && ops->callbacks.gso_send_check)) {
7474
skb_reset_transport_header(skb);
75-
err = ops->gso_send_check(skb);
75+
err = ops->callbacks.gso_send_check(skb);
7676
}
7777
rcu_read_unlock();
7878

@@ -113,9 +113,9 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
113113
proto = ipv6_gso_pull_exthdrs(skb, ipv6h->nexthdr);
114114
rcu_read_lock();
115115
ops = rcu_dereference(inet6_offloads[proto]);
116-
if (likely(ops && ops->gso_segment)) {
116+
if (likely(ops && ops->callbacks.gso_segment)) {
117117
skb_reset_transport_header(skb);
118-
segs = ops->gso_segment(skb, features);
118+
segs = ops->callbacks.gso_segment(skb, features);
119119
}
120120
rcu_read_unlock();
121121

@@ -173,15 +173,15 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,
173173
rcu_read_lock();
174174
proto = iph->nexthdr;
175175
ops = rcu_dereference(inet6_offloads[proto]);
176-
if (!ops || !ops->gro_receive) {
176+
if (!ops || !ops->callbacks.gro_receive) {
177177
__pskb_pull(skb, skb_gro_offset(skb));
178178
proto = ipv6_gso_pull_exthdrs(skb, proto);
179179
skb_gro_pull(skb, -skb_transport_offset(skb));
180180
skb_reset_transport_header(skb);
181181
__skb_push(skb, skb_gro_offset(skb));
182182

183183
ops = rcu_dereference(inet6_offloads[proto]);
184-
if (!ops || !ops->gro_receive)
184+
if (!ops || !ops->callbacks.gro_receive)
185185
goto out_unlock;
186186

187187
iph = ipv6_hdr(skb);
@@ -220,7 +220,7 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head,
220220
csum = skb->csum;
221221
skb_postpull_rcsum(skb, iph, skb_network_header_len(skb));
222222

223-
pp = ops->gro_receive(head, skb);
223+
pp = ops->callbacks.gro_receive(head, skb);
224224

225225
skb->csum = csum;
226226

@@ -244,10 +244,10 @@ static int ipv6_gro_complete(struct sk_buff *skb)
244244

245245
rcu_read_lock();
246246
ops = rcu_dereference(inet6_offloads[NAPI_GRO_CB(skb)->proto]);
247-
if (WARN_ON(!ops || !ops->gro_complete))
247+
if (WARN_ON(!ops || !ops->callbacks.gro_complete))
248248
goto out_unlock;
249249

250-
err = ops->gro_complete(skb);
250+
err = ops->callbacks.gro_complete(skb);
251251

252252
out_unlock:
253253
rcu_read_unlock();
@@ -257,10 +257,12 @@ static int ipv6_gro_complete(struct sk_buff *skb)
257257

258258
static struct packet_offload ipv6_packet_offload __read_mostly = {
259259
.type = cpu_to_be16(ETH_P_IPV6),
260-
.gso_send_check = ipv6_gso_send_check,
261-
.gso_segment = ipv6_gso_segment,
262-
.gro_receive = ipv6_gro_receive,
263-
.gro_complete = ipv6_gro_complete,
260+
.callbacks = {
261+
.gso_send_check = ipv6_gso_send_check,
262+
.gso_segment = ipv6_gso_segment,
263+
.gro_receive = ipv6_gro_receive,
264+
.gro_complete = ipv6_gro_complete,
265+
},
264266
};
265267

266268
static int __init ipv6_offload_init(void)

net/ipv6/tcpv6_offload.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,12 @@ static int tcp6_gro_complete(struct sk_buff *skb)
8181
}
8282

8383
static const struct net_offload tcpv6_offload = {
84-
.gso_send_check = tcp_v6_gso_send_check,
85-
.gso_segment = tcp_tso_segment,
86-
.gro_receive = tcp6_gro_receive,
87-
.gro_complete = tcp6_gro_complete,
84+
.callbacks = {
85+
.gso_send_check = tcp_v6_gso_send_check,
86+
.gso_segment = tcp_tso_segment,
87+
.gro_receive = tcp6_gro_receive,
88+
.gro_complete = tcp6_gro_complete,
89+
},
8890
};
8991

9092
int __init tcpv6_offload_init(void)

net/ipv6/udp_offload.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,10 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
107107
return segs;
108108
}
109109
static const struct net_offload udpv6_offload = {
110-
.gso_send_check = udp6_ufo_send_check,
111-
.gso_segment = udp6_ufo_fragment,
110+
.callbacks = {
111+
.gso_send_check = udp6_ufo_send_check,
112+
.gso_segment = udp6_ufo_fragment,
113+
},
112114
};
113115

114116
int __init udp_offload_init(void)

0 commit comments

Comments
 (0)