summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoritojun <>2003-06-11 02:54:02 +0000
committeritojun <>2003-06-11 02:54:02 +0000
commitbf4543146942d69d86bd7bcda7713e9470d8a707 (patch)
tree1b911c68861d078402280165b62385f83a328949
parent6f60db28e5d038750e0caaa625df18fbe73f551a (diff)
downloadopenbsd-bf4543146942d69d86bd7bcda7713e9470d8a707.tar.gz
openbsd-bf4543146942d69d86bd7bcda7713e9470d8a707.tar.bz2
openbsd-bf4543146942d69d86bd7bcda7713e9470d8a707.zip
- sync up MLD declaration with RFC3542 (s/MLD6/MLD/)
- routing header declaration with RFC3542 (note: sizeof(ip6_rthdr0) has changed!) also, sync up with RFC2460 routing header definition (no "strict" source routing mode any more) part of advanced API update (RFC2292 -> 3542). markus, todd, millert, henning ok
-rw-r--r--src/lib/libc/net/rthdr.c30
1 files changed, 7 insertions, 23 deletions
diff --git a/src/lib/libc/net/rthdr.c b/src/lib/libc/net/rthdr.c
index 904d61c8bc..366ca9e6ba 100644
--- a/src/lib/libc/net/rthdr.c
+++ b/src/lib/libc/net/rthdr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: rthdr.c,v 1.5 2003/06/06 07:27:52 itojun Exp $ */ 1/* $OpenBSD: rthdr.c,v 1.6 2003/06/11 02:54:02 itojun Exp $ */
2 2
3/* 3/*
4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -47,7 +47,7 @@ inet6_rthdr_space(type, seg)
47 case IPV6_RTHDR_TYPE_0: 47 case IPV6_RTHDR_TYPE_0:
48 if (seg < 1 || seg > 23) 48 if (seg < 1 || seg > 23)
49 return (0); 49 return (0);
50 return (CMSG_SPACE(sizeof(struct in6_addr) * (seg - 1) + 50 return (CMSG_SPACE(sizeof(struct in6_addr) * seg +
51 sizeof(struct ip6_rthdr0))); 51 sizeof(struct ip6_rthdr0)));
52 default: 52 default:
53 return (0); 53 return (0);
@@ -69,8 +69,7 @@ inet6_rthdr_init(bp, type)
69 69
70 switch (type) { 70 switch (type) {
71 case IPV6_RTHDR_TYPE_0: 71 case IPV6_RTHDR_TYPE_0:
72 ch->cmsg_len = CMSG_LEN(sizeof(struct ip6_rthdr0) - 72 ch->cmsg_len = CMSG_LEN(sizeof(struct ip6_rthdr0));
73 sizeof(struct in6_addr));
74 bzero(rthdr, sizeof(struct ip6_rthdr0)); 73 bzero(rthdr, sizeof(struct ip6_rthdr0));
75 rthdr->ip6r_type = IPV6_RTHDR_TYPE_0; 74 rthdr->ip6r_type = IPV6_RTHDR_TYPE_0;
76 return (ch); 75 return (ch);
@@ -93,16 +92,10 @@ inet6_rthdr_add(cmsg, addr, flags)
93 case IPV6_RTHDR_TYPE_0: 92 case IPV6_RTHDR_TYPE_0:
94 { 93 {
95 struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; 94 struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr;
96 if (flags != IPV6_RTHDR_LOOSE && flags != IPV6_RTHDR_STRICT) 95 if (flags != IPV6_RTHDR_LOOSE)
97 return (-1); 96 return (-1);
98 if (rt0->ip6r0_segleft == 23) 97 if (rt0->ip6r0_segleft == 23)
99 return (-1); 98 return (-1);
100 if (flags == IPV6_RTHDR_STRICT) {
101 int c, b;
102 c = rt0->ip6r0_segleft / 8;
103 b = rt0->ip6r0_segleft % 8;
104 rt0->ip6r0_slmap[c] |= (1 << (7 - b));
105 }
106 rt0->ip6r0_segleft++; 99 rt0->ip6r0_segleft++;
107 bcopy(addr, (caddr_t)rt0 + ((rt0->ip6r0_len + 1) << 3), 100 bcopy(addr, (caddr_t)rt0 + ((rt0->ip6r0_len + 1) << 3),
108 sizeof(struct in6_addr)); 101 sizeof(struct in6_addr));
@@ -130,16 +123,10 @@ inet6_rthdr_lasthop(cmsg, flags)
130 case IPV6_RTHDR_TYPE_0: 123 case IPV6_RTHDR_TYPE_0:
131 { 124 {
132 struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; 125 struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr;
133 if (flags != IPV6_RTHDR_LOOSE && flags != IPV6_RTHDR_STRICT) 126 if (flags != IPV6_RTHDR_LOOSE)
134 return (-1); 127 return (-1);
135 if (rt0->ip6r0_segleft > 23) 128 if (rt0->ip6r0_segleft > 23)
136 return (-1); 129 return (-1);
137 if (flags == IPV6_RTHDR_STRICT) {
138 int c, b;
139 c = rt0->ip6r0_segleft / 8;
140 b = rt0->ip6r0_segleft % 8;
141 rt0->ip6r0_slmap[c] |= (1 << (7 - b));
142 }
143 break; 130 break;
144 } 131 }
145 default: 132 default:
@@ -204,7 +191,7 @@ inet6_rthdr_getaddr(cmsg, index)
204 naddr = (rt0->ip6r0_len * 8) / sizeof(struct in6_addr); 191 naddr = (rt0->ip6r0_len * 8) / sizeof(struct in6_addr);
205 if (index <= 0 || naddr < index) 192 if (index <= 0 || naddr < index)
206 return NULL; 193 return NULL;
207 return &rt0->ip6r0_addr[index - 1]; 194 return ((struct in6_addr *)(rt0 + 1)) + index;
208 } 195 }
209 196
210 default: 197 default:
@@ -232,10 +219,7 @@ inet6_rthdr_getflags(cmsg, index)
232 naddr = (rt0->ip6r0_len * 8) / sizeof(struct in6_addr); 219 naddr = (rt0->ip6r0_len * 8) / sizeof(struct in6_addr);
233 if (index < 0 || naddr < index) 220 if (index < 0 || naddr < index)
234 return (-1); 221 return (-1);
235 if (rt0->ip6r0_slmap[index / 8] & (0x80 >> (index % 8))) 222 return IPV6_RTHDR_LOOSE;
236 return IPV6_RTHDR_STRICT;
237 else
238 return IPV6_RTHDR_LOOSE;
239 } 223 }
240 224
241 default: 225 default: