Skip to content

Commit 40893fd

Browse files
jasowangdavem330
authored andcommitted
net: switch to use skb_probe_transport_header()
Switch to use the new help skb_probe_transport_header() to do the l4 header probing for untrusted sources. For packets with partial csum, the header should already been set by skb_partial_csum_set(). Cc: Eric Dumazet <[email protected]> Signed-off-by: Jason Wang <[email protected]> Acked-by: Eric Dumazet <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 5203cd2 commit 40893fd

File tree

4 files changed

+6
-45
lines changed

4 files changed

+6
-45
lines changed

drivers/net/macvtap.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include <net/rtnetlink.h>
2222
#include <net/sock.h>
2323
#include <linux/virtio_net.h>
24-
#include <net/flow_keys.h>
2524

2625
/*
2726
* A macvtap queue is the central object of this driver, it connects
@@ -646,7 +645,6 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
646645
int vnet_hdr_len = 0;
647646
int copylen = 0;
648647
bool zerocopy = false;
649-
struct flow_keys keys;
650648

651649
if (q->flags & IFF_VNET_HDR) {
652650
vnet_hdr_len = q->vnet_hdr_sz;
@@ -727,12 +725,7 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
727725
goto err_kfree;
728726
}
729727

730-
if (skb->ip_summed == CHECKSUM_PARTIAL)
731-
skb_set_transport_header(skb, skb_checksum_start_offset(skb));
732-
else if (skb_flow_dissect(skb, &keys))
733-
skb_set_transport_header(skb, keys.thoff);
734-
else
735-
skb_set_transport_header(skb, ETH_HLEN);
728+
skb_probe_transport_header(skb, ETH_HLEN);
736729

737730
rcu_read_lock_bh();
738731
vlan = rcu_dereference_bh(q->vlan);

drivers/net/tun.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@
7070
#include <net/sock.h>
7171

7272
#include <asm/uaccess.h>
73-
#include <net/flow_keys.h>
7473

7574
/* Uncomment to enable debugging */
7675
/* #define TUN_DEBUG 1 */
@@ -1050,7 +1049,6 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
10501049
bool zerocopy = false;
10511050
int err;
10521051
u32 rxhash;
1053-
struct flow_keys keys;
10541052

10551053
if (!(tun->flags & TUN_NO_PI)) {
10561054
if ((len -= sizeof(pi)) > total_len)
@@ -1205,13 +1203,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
12051203
}
12061204

12071205
skb_reset_network_header(skb);
1208-
1209-
if (skb->ip_summed == CHECKSUM_PARTIAL)
1210-
skb_set_transport_header(skb, skb_checksum_start_offset(skb));
1211-
else if (skb_flow_dissect(skb, &keys))
1212-
skb_set_transport_header(skb, keys.thoff);
1213-
else
1214-
skb_reset_transport_header(skb);
1206+
skb_probe_transport_header(skb, 0);
12151207

12161208
rxhash = skb_get_rxhash(skb);
12171209
netif_rx_ni(skb);

drivers/net/xen-netback/netback.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
#include <linux/udp.h>
4040

4141
#include <net/tcp.h>
42-
#include <net/flow_keys.h>
4342

4443
#include <xen/xen.h>
4544
#include <xen/events.h>
@@ -1506,14 +1505,7 @@ static void xen_netbk_tx_submit(struct xen_netbk *netbk)
15061505
continue;
15071506
}
15081507

1509-
if (!skb_transport_header_was_set(skb)) {
1510-
struct flow_keys keys;
1511-
1512-
if (skb_flow_dissect(skb, &keys))
1513-
skb_set_transport_header(skb, keys.thoff);
1514-
else
1515-
skb_reset_transport_header(skb);
1516-
}
1508+
skb_probe_transport_header(skb, 0);
15171509

15181510
vif->dev->stats.rx_bytes += skb->len;
15191511
vif->dev->stats.rx_packets++;

net/packet/af_packet.c

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@
8888
#include <linux/virtio_net.h>
8989
#include <linux/errqueue.h>
9090
#include <linux/net_tstamp.h>
91-
#include <net/flow_keys.h>
9291

9392
#ifdef CONFIG_INET
9493
#include <net/inet_common.h>
@@ -1413,7 +1412,6 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
14131412
__be16 proto = 0;
14141413
int err;
14151414
int extra_len = 0;
1416-
struct flow_keys keys;
14171415

14181416
/*
14191417
* Get and verify the address.
@@ -1514,10 +1512,7 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock,
15141512
if (unlikely(extra_len == 4))
15151513
skb->no_fcs = 1;
15161514

1517-
if (skb_flow_dissect(skb, &keys))
1518-
skb_set_transport_header(skb, keys.thoff);
1519-
else
1520-
skb_reset_transport_header(skb);
1515+
skb_probe_transport_header(skb, 0);
15211516

15221517
dev_queue_xmit(skb);
15231518
rcu_read_unlock();
@@ -1925,7 +1920,6 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
19251920
struct page *page;
19261921
void *data;
19271922
int err;
1928-
struct flow_keys keys;
19291923

19301924
ph.raw = frame;
19311925

@@ -1950,11 +1944,7 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
19501944

19511945
skb_reserve(skb, hlen);
19521946
skb_reset_network_header(skb);
1953-
1954-
if (skb_flow_dissect(skb, &keys))
1955-
skb_set_transport_header(skb, keys.thoff);
1956-
else
1957-
skb_reset_transport_header(skb);
1947+
skb_probe_transport_header(skb, 0);
19581948

19591949
if (po->tp_tx_has_off) {
19601950
int off_min, off_max, off;
@@ -2212,7 +2202,6 @@ static int packet_snd(struct socket *sock,
22122202
unsigned short gso_type = 0;
22132203
int hlen, tlen;
22142204
int extra_len = 0;
2215-
struct flow_keys keys;
22162205

22172206
/*
22182207
* Get and verify the address.
@@ -2365,12 +2354,7 @@ static int packet_snd(struct socket *sock,
23652354
len += vnet_hdr_len;
23662355
}
23672356

2368-
if (skb->ip_summed == CHECKSUM_PARTIAL)
2369-
skb_set_transport_header(skb, skb_checksum_start_offset(skb));
2370-
else if (skb_flow_dissect(skb, &keys))
2371-
skb_set_transport_header(skb, keys.thoff);
2372-
else
2373-
skb_set_transport_header(skb, reserve);
2357+
skb_probe_transport_header(skb, reserve);
23742358

23752359
if (unlikely(extra_len == 4))
23762360
skb->no_fcs = 1;

0 commit comments

Comments
 (0)