@@ -499,6 +499,7 @@ static void l2tp_recv_dequeue(struct l2tp_session *session)
499
499
static inline int l2tp_verify_udp_checksum (struct sock * sk ,
500
500
struct sk_buff * skb )
501
501
{
502
+ struct l2tp_tunnel * tunnel = (struct l2tp_tunnel * )sk -> sk_user_data ;
502
503
struct udphdr * uh = udp_hdr (skb );
503
504
u16 ulen = ntohs (uh -> len );
504
505
__wsum psum ;
@@ -507,7 +508,7 @@ static inline int l2tp_verify_udp_checksum(struct sock *sk,
507
508
return 0 ;
508
509
509
510
#if IS_ENABLED (CONFIG_IPV6 )
510
- if (sk -> sk_family == PF_INET6 ) {
511
+ if (sk -> sk_family == PF_INET6 && ! tunnel -> v4mapped ) {
511
512
if (!uh -> check ) {
512
513
LIMIT_NETDEBUG (KERN_INFO "L2TP: IPv6: checksum is 0\n" );
513
514
return 1 ;
@@ -1071,7 +1072,7 @@ static int l2tp_xmit_core(struct l2tp_session *session, struct sk_buff *skb,
1071
1072
/* Queue the packet to IP for output */
1072
1073
skb -> local_df = 1 ;
1073
1074
#if IS_ENABLED (CONFIG_IPV6 )
1074
- if (skb -> sk -> sk_family == PF_INET6 )
1075
+ if (skb -> sk -> sk_family == PF_INET6 && ! tunnel -> v4mapped )
1075
1076
error = inet6_csk_xmit (skb , NULL );
1076
1077
else
1077
1078
#endif
@@ -1198,7 +1199,7 @@ int l2tp_xmit_skb(struct l2tp_session *session, struct sk_buff *skb, int hdr_len
1198
1199
1199
1200
/* Calculate UDP checksum if configured to do so */
1200
1201
#if IS_ENABLED (CONFIG_IPV6 )
1201
- if (sk -> sk_family == PF_INET6 )
1202
+ if (sk -> sk_family == PF_INET6 && ! tunnel -> v4mapped )
1202
1203
l2tp_xmit_ipv6_csum (sk , skb , udp_len );
1203
1204
else
1204
1205
#endif
@@ -1647,6 +1648,24 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32
1647
1648
if (cfg != NULL )
1648
1649
tunnel -> debug = cfg -> debug ;
1649
1650
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
+
1650
1669
/* Mark socket as an encapsulation socket. See net/ipv4/udp.c */
1651
1670
tunnel -> encap = encap ;
1652
1671
if (encap == L2TP_ENCAPTYPE_UDP ) {
@@ -1655,7 +1674,7 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32
1655
1674
udp_sk (sk )-> encap_rcv = l2tp_udp_encap_recv ;
1656
1675
udp_sk (sk )-> encap_destroy = l2tp_udp_encap_destroy ;
1657
1676
#if IS_ENABLED (CONFIG_IPV6 )
1658
- if (sk -> sk_family == PF_INET6 )
1677
+ if (sk -> sk_family == PF_INET6 && ! tunnel -> v4mapped )
1659
1678
udpv6_encap_enable ();
1660
1679
else
1661
1680
#endif
0 commit comments