skb->protocol = eth_type_trans(skb, current->nsproxy->net_ns->loopback_dev);
        skb_reset_network_header(skb);
 
+       switch (skb->protocol) {
+       case htons(ETH_P_IP):
+               sk->sk_family = AF_INET;
+               if (sizeof(struct iphdr) <= skb_headlen(skb)) {
+                       sk->sk_rcv_saddr = ip_hdr(skb)->saddr;
+                       sk->sk_daddr = ip_hdr(skb)->daddr;
+               }
+               break;
+#if IS_ENABLED(CONFIG_IPV6)
+       case htons(ETH_P_IPV6):
+               sk->sk_family = AF_INET6;
+               if (sizeof(struct ipv6hdr) <= skb_headlen(skb)) {
+                       sk->sk_v6_rcv_saddr = ipv6_hdr(skb)->saddr;
+                       sk->sk_v6_daddr = ipv6_hdr(skb)->daddr;
+               }
+               break;
+#endif
+       default:
+               break;
+       }
+
        if (is_l2)
                __skb_push(skb, hh_len);
        if (is_direct_pkt_access)