diff options
author | itojun <> | 2003-06-11 02:54:02 +0000 |
---|---|---|
committer | itojun <> | 2003-06-11 02:54:02 +0000 |
commit | bf4543146942d69d86bd7bcda7713e9470d8a707 (patch) | |
tree | 1b911c68861d078402280165b62385f83a328949 | |
parent | 6f60db28e5d038750e0caaa625df18fbe73f551a (diff) | |
download | openbsd-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.c | 30 |
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: |