@@ -499,6 +499,7 @@ static void l2tp_recv_dequeue(struct l2tp_session *session)
499499static inline int l2tp_verify_udp_checksum (struct sock * sk ,
500500 struct sk_buff * skb )
501501{
502+ struct l2tp_tunnel * tunnel = (struct l2tp_tunnel * )sk -> sk_user_data ;
502503 struct udphdr * uh = udp_hdr (skb );
503504 u16 ulen = ntohs (uh -> len );
504505 __wsum psum ;
@@ -507,7 +508,7 @@ static inline int l2tp_verify_udp_checksum(struct sock *sk,
507508 return 0 ;
508509
509510#if IS_ENABLED (CONFIG_IPV6 )
510- if (sk -> sk_family == PF_INET6 ) {
511+ if (sk -> sk_family == PF_INET6 && ! tunnel -> v4mapped ) {
511512 if (!uh -> check ) {
512513 LIMIT_NETDEBUG (KERN_INFO "L2TP: IPv6: checksum is 0\n" );
513514 return 1 ;
@@ -1071,7 +1072,7 @@ static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb,
10711072 /* Queue the packet to IP for output */
10721073 skb -> local_df = 1 ;
10731074#if IS_ENABLED (CONFIG_IPV6 )
1074- if (skb -> sk -> sk_family == PF_INET6 )
1075+ if (skb -> sk -> sk_family == PF_INET6 && ! tunnel -> v4mapped )
10751076 error = inet6_csk_xmit (skb , NULL );
10761077 else
10771078#endif
@@ -1198,7 +1199,7 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len
11981199
11991200 /* Calculate UDP checksum if configured to do so */
12001201#if IS_ENABLED (CONFIG_IPV6 )
1201- if (sk -> sk_family == PF_INET6 )
1202+ if (sk -> sk_family == PF_INET6 && ! tunnel -> v4mapped )
12021203 l2tp_xmit_ipv6_csum (sk , skb , udp_len );
12031204 else
12041205#endif
@@ -1647,6 +1648,24 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32
16471648 if (cfg != NULL )
16481649 tunnel -> debug = cfg -> debug ;
16491650
1651+ #if IS_ENABLED (CONFIG_IPV6 )
1652+ if (sk -> sk_family == PF_INET6 ) {
1653+ struct ipv6_pinfo * np = inet6_sk (sk );
1654+
1655+ if (ipv6_addr_v4mapped (& np -> saddr ) &&
1656+ ipv6_addr_v4mapped (& np -> daddr )) {
1657+ struct inet_sock * inet = inet_sk (sk );
1658+
1659+ tunnel -> v4mapped = true;
1660+ inet -> inet_saddr = np -> saddr .s6_addr32 [3 ];
1661+ inet -> inet_rcv_saddr = np -> rcv_saddr .s6_addr32 [3 ];
1662+ inet -> inet_daddr = np -> daddr .s6_addr32 [3 ];
1663+ } else {
1664+ tunnel -> v4mapped = false;
1665+ }
1666+ }
1667+ #endif
1668+
16501669 /* Mark socket as an encapsulation socket. See net/ipv4/udp.c */
16511670 tunnel -> encap = encap ;
16521671 if (encap == L2TP_ENCAPTYPE_UDP ) {
@@ -1655,7 +1674,7 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32
16551674 udp_sk (sk )-> encap_rcv = l2tp_udp_encap_recv ;
16561675 udp_sk (sk )-> encap_destroy = l2tp_udp_encap_destroy ;
16571676#if IS_ENABLED (CONFIG_IPV6 )
1658- if (sk -> sk_family == PF_INET6 )
1677+ if (sk -> sk_family == PF_INET6 && ! tunnel -> v4mapped )
16591678 udpv6_encap_enable ();
16601679 else
16611680#endif
0 commit comments