diff -urN linux.orig/include/linux/in6.h linux/include/linux/in6.h --- linux.orig/include/linux/in6.h Sun Mar 25 18:31:04 2001 +++ linux/include/linux/in6.h Thu May 9 18:31:33 2002 @@ -45,6 +45,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.orig/include/net/ipv6.h linux/include/net/ipv6.h --- linux.orig/include/net/ipv6.h Sun Mar 25 18:31:08 2001 +++ linux/include/net/ipv6.h Thu May 9 18:31:33 2002 @@ -20,6 +20,8 @@ #include #include +#define SIN6_LEN_RFC2133 24 + /* * NextHeader field of IPv6 header */ diff -urN linux.orig/net/ipv6/addrconf.c linux/net/ipv6/addrconf.c --- linux.orig/net/ipv6/addrconf.c Sun Mar 25 18:31:13 2001 +++ linux/net/ipv6/addrconf.c Thu May 9 18:31:30 2002 @@ -255,8 +255,6 @@ idev = ipv6_add_dev(dev); if (idev == NULL) return NULL; - if (dev->flags&IFF_UP) - ipv6_mc_up(idev); } return idev; } @@ -1045,6 +1043,8 @@ return; } + ipv6_mc_up(idev); + addrconf_lock(); ifp = ipv6_add_addr(idev, &addr, IFA_HOST); @@ -1084,6 +1084,8 @@ if (idev == NULL) return; + ipv6_mc_up(idev); + #ifdef CONFIG_IPV6_EUI64 memset(&addr, 0, sizeof(struct in6_addr)); @@ -1121,6 +1123,8 @@ return; } + ipv6_mc_up(idev); + sit_add_v4_addrs(idev); if (dev->flags&IFF_POINTOPOINT) { diff -urN linux.orig/net/ipv6/af_inet6.c linux/net/ipv6/af_inet6.c --- linux.orig/net/ipv6/af_inet6.c Sun Mar 25 18:31:13 2001 +++ linux/net/ipv6/af_inet6.c Thu May 9 18:31:33 2002 @@ -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.orig/net/ipv6/datagram.c linux/net/ipv6/datagram.c --- linux.orig/net/ipv6/datagram.c Sun Mar 25 18:31:13 2001 +++ linux/net/ipv6/datagram.c Thu May 9 18:31:33 2002 @@ -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.orig/net/ipv6/raw.c linux/net/ipv6/raw.c --- linux.orig/net/ipv6/raw.c Fri Nov 2 17:39:16 2001 +++ linux/net/ipv6/raw.c Thu May 9 18:31:33 2002 @@ -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.orig/net/ipv6/tcp_ipv6.c linux/net/ipv6/tcp_ipv6.c --- linux.orig/net/ipv6/tcp_ipv6.c Sun Mar 25 18:31:13 2001 +++ linux/net/ipv6/tcp_ipv6.c Thu May 9 18:31:33 2002 @@ -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.orig/net/ipv6/udp.c linux/net/ipv6/udp.c --- linux.orig/net/ipv6/udp.c Sun Mar 25 18:31:13 2001 +++ linux/net/ipv6/udp.c Thu May 9 18:31:33 2002 @@ -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) diff -urN linux.orig/net/netsyms.c linux/net/netsyms.c --- linux.orig/net/netsyms.c Sun Mar 25 18:37:41 2001 +++ linux/net/netsyms.c Thu May 9 18:31:20 2002 @@ -101,8 +101,9 @@ #include #endif -#ifdef CONFIG_SYSCTL extern int sysctl_max_syn_backlog; + +#ifdef CONFIG_SYSCTL extern int sysctl_ip_always_defrag; #endif @@ -365,8 +366,9 @@ EXPORT_SYMBOL(dev_loopback_xmit); EXPORT_SYMBOL(tcp_regs); -#ifdef CONFIG_SYSCTL EXPORT_SYMBOL(sysctl_max_syn_backlog); + +#ifdef CONFIG_SYSCTL EXPORT_SYMBOL(sysctl_ip_always_defrag); #endif #endif