diff -urN linux-2.2.17.org/include/linux/in6.h linux-2.2.17/include/linux/in6.h --- linux-2.2.17.org/include/linux/in6.h Wed Dec 6 18:06:51 2000 +++ linux-2.2.17/include/linux/in6.h Wed Dec 6 18:09:01 2000 @@ -56,6 +56,7 @@ __u16 sin6_port; /* Transport layer port # */ __u32 sin6_flowinfo; /* IPv6 flow information */ struct in6_addr sin6_addr; /* IPv6 address */ + __u32 sin6_scope_id; /* scope id (new in RFC2553) */ }; diff -urN linux-2.2.17.org/include/net/ipv6.h linux-2.2.17/include/net/ipv6.h --- linux-2.2.17.org/include/net/ipv6.h Wed Dec 6 18:06:51 2000 +++ linux-2.2.17/include/net/ipv6.h Wed Dec 6 18:09:01 2000 @@ -20,6 +20,8 @@ #include #include +#define SIN6_LEN_RFC2133 24 + /* * NextHeader field of IPv6 header */ diff -urN linux-2.2.17.org/net/ipv6/af_inet6.c linux-2.2.17/net/ipv6/af_inet6.c --- linux-2.2.17.org/net/ipv6/af_inet6.c Wed Dec 6 18:06:51 2000 +++ linux-2.2.17/net/ipv6/af_inet6.c Wed Dec 6 18:09:01 2000 @@ -199,7 +199,7 @@ /* Check these errors (active socket, bad address length, double bind). */ if ((sk->state != TCP_CLOSE) || - (addr_len < sizeof(struct sockaddr_in6)) || + (addr_len < SIN6_LEN_RFC2133) || (sk->num != 0)) return -EINVAL; @@ -334,6 +334,7 @@ sin->sin6_port = sk->sport; } + sin->sin6_scope_id = 0; *uaddr_len = sizeof(*sin); return(0); } diff -urN linux-2.2.17.org/net/ipv6/datagram.c linux-2.2.17/net/ipv6/datagram.c --- linux-2.2.17.org/net/ipv6/datagram.c Wed Dec 6 18:06:51 2000 +++ linux-2.2.17/net/ipv6/datagram.c Wed Dec 6 18:10:00 2000 @@ -133,9 +133,11 @@ if (sin) { sin->sin6_family = AF_INET6; sin->sin6_flowinfo = 0; + sin->sin6_scope_id = 0; sin->sin6_port = serr->port; if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) { memcpy(&sin->sin6_addr, skb->nh.raw + serr->addr_offset, 16); + sin->sin6_scope_id = 0; if (sk->net_pinfo.af_inet6.sndflow) sin->sin6_flowinfo = *(u32*)(skb->nh.raw + serr->addr_offset - 24) & IPV6_FLOWINFO_MASK; } else @@ -150,8 +152,10 @@ if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) { sin->sin6_family = AF_INET6; sin->sin6_flowinfo = 0; + sin->sin6_scope_id = 0; if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6) { memcpy(&sin->sin6_addr, &skb->nh.ipv6h->saddr, 16); + sin->sin6_scope_id = 0; if (sk->net_pinfo.af_inet6.rxopt.all) datagram_recv_ctl(sk, msg, skb); } else { diff -urN linux-2.2.17.org/net/ipv6/raw.c linux-2.2.17/net/ipv6/raw.c --- linux-2.2.17.org/net/ipv6/raw.c Wed Dec 6 18:06:51 2000 +++ linux-2.2.17/net/ipv6/raw.c Wed Dec 6 18:09:01 2000 @@ -117,7 +117,7 @@ int addr_type; /* Check these errors. */ - if (sk->state != TCP_CLOSE || (addr_len < sizeof(struct sockaddr_in6))) + if (sk->state != TCP_CLOSE || (addr_len < SIN6_LEN_RFC2133)) return -EINVAL; addr_type = ipv6_addr_type(&addr->sin6_addr); @@ -252,6 +252,7 @@ memcpy(&sin6->sin6_addr, &skb->nh.ipv6h->saddr, sizeof(struct in6_addr)); sin6->sin6_flowinfo = 0; + sin6->sin6_scope_id = 0; } if (sk->net_pinfo.af_inet6.rxopt.all) @@ -360,7 +361,7 @@ fl.fl6_flowlabel = 0; if (sin6) { - if (addr_len < sizeof(struct sockaddr_in6)) + if (addr_len < SIN6_LEN_RFC2133) return(-EINVAL); if (sin6->sin6_family && sin6->sin6_family != AF_INET6) diff -urN linux-2.2.17.org/net/ipv6/tcp_ipv6.c linux-2.2.17/net/ipv6/tcp_ipv6.c --- linux-2.2.17.org/net/ipv6/tcp_ipv6.c Wed Dec 6 18:06:51 2000 +++ linux-2.2.17/net/ipv6/tcp_ipv6.c Wed Dec 6 18:09:01 2000 @@ -387,7 +387,7 @@ if(!ipv6_addr_any(&np->daddr)) return -EINVAL; - if (addr_len < sizeof(struct sockaddr_in6)) + if (addr_len < SIN6_LEN_RFC2133) return(-EINVAL); if (usin->sin6_family && usin->sin6_family != AF_INET6) @@ -1583,6 +1583,7 @@ sin6->sin6_port = sk->dport; /* We do not store received flowlabel for TCP */ sin6->sin6_flowinfo = 0; + sin6->sin6_scope_id = 0; } static struct tcp_func ipv6_specific = { diff -urN linux-2.2.17.org/net/ipv6/udp.c linux-2.2.17/net/ipv6/udp.c --- linux-2.2.17.org/net/ipv6/udp.c Wed Dec 6 18:06:51 2000 +++ linux-2.2.17/net/ipv6/udp.c Wed Dec 6 18:14:24 2000 @@ -210,7 +210,7 @@ goto ipv4_connected; } - if (addr_len < sizeof(*usin)) + if (addr_len < SIN6_LEN_RFC2133) return(-EINVAL); if (usin->sin6_family && usin->sin6_family != AF_INET6) @@ -414,6 +414,7 @@ sin6->sin6_family = AF_INET6; sin6->sin6_port = skb->h.uh->source; sin6->sin6_flowinfo = 0; + sin6->sin6_scope_id = 0; if (skb->protocol == __constant_htons(ETH_P_IP)) { ipv6_addr_set(&sin6->sin6_addr, 0, 0, @@ -424,6 +425,7 @@ memcpy(&sin6->sin6_addr, &skb->nh.ipv6h->saddr, sizeof(struct in6_addr)); + sin6->sin6_scope_id = 0; if (sk->net_pinfo.af_inet6.rxopt.all) datagram_recv_ctl(sk, msg, skb); } @@ -777,7 +779,7 @@ if (sin6->sin6_family == AF_INET) return udp_sendmsg(sk, msg, ulen); - if (addr_len < sizeof(*sin6)) + if (addr_len < SIN6_LEN_RFC2133) return(-EINVAL); if (sin6->sin6_family && sin6->sin6_family != AF_INET6)