-No wiêc sytuacja wygl±da tak:
-
-Minimalne j±dro, które nale¿y posiadaæ by móc przej¶æ na glibce2.2
-to 2.2.17. Radzê nie próbowaæ ze starszymi bo mo¿e takiego delikwenta
-spotkaæ niespodzianka typu:
-
-[misiek@ikar misiek]$ ./glibc22-jajco22test (statycznie linkowany)
-FATAL: kernel too old
-Przerwane
-[misiek@ikar misiek]$ uname -r
-2.2.16
-
-Je¶li chodzi o kwestie zwi±zane z IPv6 to minimalna wersja oficjalne
-supportowanego jaja to:
-
-2.2.x - dla glibców 2.1.x
-2.3.99 - dla glibców 2.2
-
-Osoby, które chc± u¿ywaæ jaja 2.2.x i glibców 2.2 maj± dwa wyj¶cia:
-a) zapomnieæ o IPv6 i *wogóle nie kompilowaæ go w jajo ani modu³*.
- Wtedy bêdzie wszystko bezproblemowo chodzi³o.
-b) nadal u¿ywaæ IPv6 po uwcze¶niejszym zapatchowaniu jaja poni¿szym
- patchem (który wkrótce trafi do dystrybucyjnego kernela 2.2.x)
-
-diff -urN linux-2.2.x.org/include/linux/in6.h linux-2.2.x/include/linux/in6.h
---- linux-2.2.x.org/include/linux/in6.h Fri Nov 17 18:21:58 2000
-+++ linux-2.2.x/include/linux/in6.h Fri Nov 17 18:22:26 2000
+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) */
};
-
-(wszystko po to, ¿eby rozmiar strucktury sockaddr_in6 w j±drze linuksa
- == rozmiarowi struktury sockaddr_in6 w glibcach 2.2).
-
-Tak zapatchowane jajo powinno bez problemów dzia³aæ równie¿ na glibcach 2.1.x
-ale nie testowa³em tego jako, ¿e ani nie u¿ywam jaj 2.2.x ani glibców 2.1.x :>
-
-Powy¿szy patch pozwoli unikn±æ k³opotów typu:
-sshd: fatal: get_sock_port: getnameinfo NI_NUMERICSERV failed
-
-Jakie¶ pytania/uwagi ?
-
-ps. kloczek/baggins -- wrzuæcie tego patcha do dystrybucyjnego jaja
- jak bêdziecie co¶ w nim grzebaæ.
-
-ps2. w attachu znajduje siê ma³y, badziwewny programik do sprawdzania
-czy jajo bêdzie dzia³a³o ok z glibcami 2.2 i IPv6. Wywo³uje siê go
-z adresem ipv6 maszyny, na której dzia³a byle jakie sshd (mo¿e siê
-³±czyæ z dowoln± inna us³ug± ipv6 -- to nie ma znaczenia -- trzeba tylko
-w ¼róde³ku port zmieniæ):
-
-[misiek@arm 3]$ ./glibc22-jajco22test ::1
-Resolving ... ::1
-Socket: 3
-Size1: 128
-Size2: 28
-Size3: 28
-Size4: 28
-Konekszyn z ipv6-localhost [::1]
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ To oraz te same warto¶ci przy size2, size3 i size4
- oznacza, ¿e jajo jest ok.
-[misiek@arm 3]$
-
-
---
-Arkadiusz Mi¶kiewicz, AM2-6BONE [ PLD GNU/Linux IPv6 ]
-http://www.t17.ds.pwr.wroc.pl/~misiek/ipv6/ [ enabled ]
+
+
+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 <net/ndisc.h>
+ #include <net/flow.h>
+
++#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)