patch-2.3.49 linux/net/ipv6/datagram.c
Next file: linux/net/ipv6/icmp.c
Previous file: linux/net/ipv6/af_inet6.c
Back to the patch index
Back to the overall index
- Lines: 42
- Date:
Sun Feb 27 18:45:10 2000
- Orig file:
v2.3.48/linux/net/ipv6/datagram.c
- Orig date:
Thu Aug 26 13:05:46 1999
diff -u --recursive --new-file v2.3.48/linux/net/ipv6/datagram.c linux/net/ipv6/datagram.c
@@ -5,7 +5,7 @@
* Authors:
* Pedro Roque <roque@di.fc.ul.pt>
*
- * $Id: datagram.c,v 1.18 1999/08/20 11:06:17 davem Exp $
+ * $Id: datagram.c,v 1.19 2000/02/27 19:51:47 davem Exp $
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -134,14 +134,20 @@
sin->sin6_family = AF_INET6;
sin->sin6_flowinfo = 0;
sin->sin6_port = serr->port;
+ sin->sin6_scope_id = 0;
if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) {
memcpy(&sin->sin6_addr, skb->nh.raw + serr->addr_offset, 16);
if (sk->net_pinfo.af_inet6.sndflow)
sin->sin6_flowinfo = *(u32*)(skb->nh.raw + serr->addr_offset - 24) & IPV6_FLOWINFO_MASK;
- } else
+ if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL) {
+ struct inet6_skb_parm *opt = (struct inet6_skb_parm *) skb->cb;
+ sin->sin6_scope_id = opt->iif;
+ }
+ } else {
ipv6_addr_set(&sin->sin6_addr, 0, 0,
__constant_htonl(0xffff),
*(u32*)(skb->nh.raw + serr->addr_offset));
+ }
}
memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
@@ -154,6 +160,10 @@
memcpy(&sin->sin6_addr, &skb->nh.ipv6h->saddr, 16);
if (sk->net_pinfo.af_inet6.rxopt.all)
datagram_recv_ctl(sk, msg, skb);
+ if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL) {
+ struct inet6_skb_parm *opt = (struct inet6_skb_parm *) skb->cb;
+ sin->sin6_scope_id = opt->iif;
+ }
} else {
ipv6_addr_set(&sin->sin6_addr, 0, 0,
__constant_htonl(0xffff),
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)