Skip to content

Commit b9d7a86

Browse files
committed
Merge: bareudp: backports from upstream
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/5240 JIRA: https://issues.redhat.com/browse/RHEL-59593 Upstream Status: linux.git Signed-off-by: Guillaume Nault <gnault@redhat.com> Approved-by: Hangbin Liu <haliu@redhat.com> Approved-by: Antoine Tenart <atenart@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Rado Vrbovsky <rvrbovsk@redhat.com>
2 parents 2239f06 + 8929c30 commit b9d7a86

File tree

1 file changed

+35
-13
lines changed

1 file changed

+35
-13
lines changed

drivers/net/bareudp.c

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
6868
__be16 proto;
6969
void *oiph;
7070
int err;
71+
int nh;
7172

7273
bareudp = rcu_dereference_sk_user_data(sk);
7374
if (!bareudp)
@@ -83,7 +84,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
8384

8485
if (skb_copy_bits(skb, BAREUDP_BASE_HLEN, &ipversion,
8586
sizeof(ipversion))) {
86-
bareudp->dev->stats.rx_dropped++;
87+
DEV_STATS_INC(bareudp->dev, rx_dropped);
8788
goto drop;
8889
}
8990
ipversion >>= 4;
@@ -93,7 +94,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
9394
} else if (ipversion == 6 && bareudp->multi_proto_mode) {
9495
proto = htons(ETH_P_IPV6);
9596
} else {
96-
bareudp->dev->stats.rx_dropped++;
97+
DEV_STATS_INC(bareudp->dev, rx_dropped);
9798
goto drop;
9899
}
99100
} else if (bareudp->ethertype == htons(ETH_P_MPLS_UC)) {
@@ -107,7 +108,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
107108
ipv4_is_multicast(tunnel_hdr->daddr)) {
108109
proto = htons(ETH_P_MPLS_MC);
109110
} else {
110-
bareudp->dev->stats.rx_dropped++;
111+
DEV_STATS_INC(bareudp->dev, rx_dropped);
111112
goto drop;
112113
}
113114
} else {
@@ -123,7 +124,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
123124
(addr_type & IPV6_ADDR_MULTICAST)) {
124125
proto = htons(ETH_P_MPLS_MC);
125126
} else {
126-
bareudp->dev->stats.rx_dropped++;
127+
DEV_STATS_INC(bareudp->dev, rx_dropped);
127128
goto drop;
128129
}
129130
}
@@ -135,23 +136,38 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
135136
proto,
136137
!net_eq(bareudp->net,
137138
dev_net(bareudp->dev)))) {
138-
bareudp->dev->stats.rx_dropped++;
139+
DEV_STATS_INC(bareudp->dev, rx_dropped);
139140
goto drop;
140141
}
141142

142143
__set_bit(IP_TUNNEL_KEY_BIT, key);
143144

144145
tun_dst = udp_tun_rx_dst(skb, family, key, 0, 0);
145146
if (!tun_dst) {
146-
bareudp->dev->stats.rx_dropped++;
147+
DEV_STATS_INC(bareudp->dev, rx_dropped);
147148
goto drop;
148149
}
149150
skb_dst_set(skb, &tun_dst->dst);
150151
skb->dev = bareudp->dev;
151-
oiph = skb_network_header(skb);
152-
skb_reset_network_header(skb);
153152
skb_reset_mac_header(skb);
154153

154+
/* Save offset of outer header relative to skb->head,
155+
* because we are going to reset the network header to the inner header
156+
* and might change skb->head.
157+
*/
158+
nh = skb_network_header(skb) - skb->head;
159+
160+
skb_reset_network_header(skb);
161+
162+
if (!pskb_inet_may_pull(skb)) {
163+
DEV_STATS_INC(bareudp->dev, rx_length_errors);
164+
DEV_STATS_INC(bareudp->dev, rx_errors);
165+
goto drop;
166+
}
167+
168+
/* Get the outer header. */
169+
oiph = skb->head + nh;
170+
155171
if (!ipv6_mod_enabled() || family == AF_INET)
156172
err = IP_ECN_decapsulate(oiph, skb);
157173
else
@@ -169,8 +185,8 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
169185
&((struct ipv6hdr *)oiph)->saddr);
170186
}
171187
if (err > 1) {
172-
++bareudp->dev->stats.rx_frame_errors;
173-
++bareudp->dev->stats.rx_errors;
188+
DEV_STATS_INC(bareudp->dev, rx_frame_errors);
189+
DEV_STATS_INC(bareudp->dev, rx_errors);
174190
goto drop;
175191
}
176192
}
@@ -307,6 +323,9 @@ static int bareudp_xmit_skb(struct sk_buff *skb, struct net_device *dev,
307323
__be32 saddr;
308324
int err;
309325

326+
if (!skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB)))
327+
return -EINVAL;
328+
310329
if (!sock)
311330
return -ESHUTDOWN;
312331

@@ -374,6 +393,9 @@ static int bareudp6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
374393
__be16 sport;
375394
int err;
376395

396+
if (!skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB)))
397+
return -EINVAL;
398+
377399
if (!sock)
378400
return -ESHUTDOWN;
379401

@@ -473,11 +495,11 @@ static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev)
473495
dev_kfree_skb(skb);
474496

475497
if (err == -ELOOP)
476-
dev->stats.collisions++;
498+
DEV_STATS_INC(dev, collisions);
477499
else if (err == -ENETUNREACH)
478-
dev->stats.tx_carrier_errors++;
500+
DEV_STATS_INC(dev, tx_carrier_errors);
479501

480-
dev->stats.tx_errors++;
502+
DEV_STATS_INC(dev, tx_errors);
481503
return NETDEV_TX_OK;
482504
}
483505

0 commit comments

Comments
 (0)