@@ -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