route6.c (105194) | route6.c (120856) |
---|---|
1/* $FreeBSD: head/sys/netinet6/route6.c 105194 2002-10-16 01:54:46Z sam $ */ | 1/* $FreeBSD: head/sys/netinet6/route6.c 120856 2003-10-06 14:02:09Z ume $ */ |
2/* $KAME: route6.c,v 1.24 2001/03/14 03:07:05 itojun Exp $ */ 3 4/* 5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions --- 96 unchanged lines hidden (view full) --- 106 */ 107 IP6_EXTHDR_GET(rh, struct ip6_rthdr *, m, off, rhlen); 108 if (rh == NULL) { 109 ip6stat.ip6s_tooshort++; 110 return IPPROTO_DONE; 111 } 112#endif 113 if (ip6_rthdr0(m, ip6, (struct ip6_rthdr0 *)rh)) | 2/* $KAME: route6.c,v 1.24 2001/03/14 03:07:05 itojun Exp $ */ 3 4/* 5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions --- 96 unchanged lines hidden (view full) --- 106 */ 107 IP6_EXTHDR_GET(rh, struct ip6_rthdr *, m, off, rhlen); 108 if (rh == NULL) { 109 ip6stat.ip6s_tooshort++; 110 return IPPROTO_DONE; 111 } 112#endif 113 if (ip6_rthdr0(m, ip6, (struct ip6_rthdr0 *)rh)) |
114 return(IPPROTO_DONE); | 114 return (IPPROTO_DONE); |
115 break; 116 default: 117 /* unknown routing type */ 118 if (rh->ip6r_segleft == 0) { 119 rhlen = (rh->ip6r_len + 1) << 3; 120 break; /* Final dst. Just ignore the header. */ 121 } 122 ip6stat.ip6s_badoptions++; 123 icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, 124 (caddr_t)&rh->ip6r_type - (caddr_t)ip6); | 115 break; 116 default: 117 /* unknown routing type */ 118 if (rh->ip6r_segleft == 0) { 119 rhlen = (rh->ip6r_len + 1) << 3; 120 break; /* Final dst. Just ignore the header. */ 121 } 122 ip6stat.ip6s_badoptions++; 123 icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, 124 (caddr_t)&rh->ip6r_type - (caddr_t)ip6); |
125 return(IPPROTO_DONE); | 125 return (IPPROTO_DONE); |
126 } 127 128 *offp += rhlen; | 126 } 127 128 *offp += rhlen; |
129 return(rh->ip6r_nxt); | 129 return (rh->ip6r_nxt); |
130} 131 132/* 133 * Type0 routing header processing 134 * 135 * RFC2292 backward compatibility warning: no support for strict/loose bitmap, 136 * as it was dropped between RFC1883 and RFC2460. 137 */ 138static int 139ip6_rthdr0(m, ip6, rh0) 140 struct mbuf *m; 141 struct ip6_hdr *ip6; 142 struct ip6_rthdr0 *rh0; 143{ 144 int addrs, index; 145 struct in6_addr *nextaddr, tmpaddr; 146 147 if (rh0->ip6r0_segleft == 0) | 130} 131 132/* 133 * Type0 routing header processing 134 * 135 * RFC2292 backward compatibility warning: no support for strict/loose bitmap, 136 * as it was dropped between RFC1883 and RFC2460. 137 */ 138static int 139ip6_rthdr0(m, ip6, rh0) 140 struct mbuf *m; 141 struct ip6_hdr *ip6; 142 struct ip6_rthdr0 *rh0; 143{ 144 int addrs, index; 145 struct in6_addr *nextaddr, tmpaddr; 146 147 if (rh0->ip6r0_segleft == 0) |
148 return(0); | 148 return (0); |
149 150 if (rh0->ip6r0_len % 2 151#ifdef COMPAT_RFC1883 152 || rh0->ip6r0_len > 46 153#endif 154 ) { 155 /* 156 * Type 0 routing header can't contain more than 23 addresses. 157 * RFC 2462: this limitation was removed since strict/loose 158 * bitmap field was deleted. 159 */ 160 ip6stat.ip6s_badoptions++; 161 icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, 162 (caddr_t)&rh0->ip6r0_len - (caddr_t)ip6); | 149 150 if (rh0->ip6r0_len % 2 151#ifdef COMPAT_RFC1883 152 || rh0->ip6r0_len > 46 153#endif 154 ) { 155 /* 156 * Type 0 routing header can't contain more than 23 addresses. 157 * RFC 2462: this limitation was removed since strict/loose 158 * bitmap field was deleted. 159 */ 160 ip6stat.ip6s_badoptions++; 161 icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, 162 (caddr_t)&rh0->ip6r0_len - (caddr_t)ip6); |
163 return(-1); | 163 return (-1); |
164 } 165 166 if ((addrs = rh0->ip6r0_len / 2) < rh0->ip6r0_segleft) { 167 ip6stat.ip6s_badoptions++; 168 icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, 169 (caddr_t)&rh0->ip6r0_segleft - (caddr_t)ip6); | 164 } 165 166 if ((addrs = rh0->ip6r0_len / 2) < rh0->ip6r0_segleft) { 167 ip6stat.ip6s_badoptions++; 168 icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_HEADER, 169 (caddr_t)&rh0->ip6r0_segleft - (caddr_t)ip6); |
170 return(-1); | 170 return (-1); |
171 } 172 173 index = addrs - rh0->ip6r0_segleft; 174 rh0->ip6r0_segleft--; 175 /* note that ip6r0_addr does not exist in RFC2292bis */ 176 nextaddr = rh0->ip6r0_addr + index; 177 178 /* 179 * reject invalid addresses. be proactive about malicious use of 180 * IPv4 mapped/compat address. 181 * XXX need more checks? 182 */ 183 if (IN6_IS_ADDR_MULTICAST(nextaddr) || 184 IN6_IS_ADDR_UNSPECIFIED(nextaddr) || 185 IN6_IS_ADDR_V4MAPPED(nextaddr) || 186 IN6_IS_ADDR_V4COMPAT(nextaddr)) { 187 ip6stat.ip6s_badoptions++; 188 m_freem(m); | 171 } 172 173 index = addrs - rh0->ip6r0_segleft; 174 rh0->ip6r0_segleft--; 175 /* note that ip6r0_addr does not exist in RFC2292bis */ 176 nextaddr = rh0->ip6r0_addr + index; 177 178 /* 179 * reject invalid addresses. be proactive about malicious use of 180 * IPv4 mapped/compat address. 181 * XXX need more checks? 182 */ 183 if (IN6_IS_ADDR_MULTICAST(nextaddr) || 184 IN6_IS_ADDR_UNSPECIFIED(nextaddr) || 185 IN6_IS_ADDR_V4MAPPED(nextaddr) || 186 IN6_IS_ADDR_V4COMPAT(nextaddr)) { 187 ip6stat.ip6s_badoptions++; 188 m_freem(m); |
189 return(-1); | 189 return (-1); |
190 } 191 if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst) || 192 IN6_IS_ADDR_UNSPECIFIED(&ip6->ip6_dst) || 193 IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst) || 194 IN6_IS_ADDR_V4COMPAT(&ip6->ip6_dst)) { 195 ip6stat.ip6s_badoptions++; 196 m_freem(m); | 190 } 191 if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst) || 192 IN6_IS_ADDR_UNSPECIFIED(&ip6->ip6_dst) || 193 IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst) || 194 IN6_IS_ADDR_V4COMPAT(&ip6->ip6_dst)) { 195 ip6stat.ip6s_badoptions++; 196 m_freem(m); |
197 return(-1); | 197 return (-1); |
198 } 199 200 /* 201 * Swap the IPv6 destination address and nextaddr. Forward the packet. 202 */ 203 tmpaddr = *nextaddr; 204 *nextaddr = ip6->ip6_dst; 205 if (IN6_IS_ADDR_LINKLOCAL(nextaddr)) --- 6 unchanged lines hidden (view full) --- 212 if (rh0->ip6r0_slmap[index / 8] & (1 << (7 - (index % 8)))) 213 ip6_forward(m, IPV6_SRCRT_NEIGHBOR); 214 else 215 ip6_forward(m, IPV6_SRCRT_NOTNEIGHBOR); 216#else 217 ip6_forward(m, 1); 218#endif 219 | 198 } 199 200 /* 201 * Swap the IPv6 destination address and nextaddr. Forward the packet. 202 */ 203 tmpaddr = *nextaddr; 204 *nextaddr = ip6->ip6_dst; 205 if (IN6_IS_ADDR_LINKLOCAL(nextaddr)) --- 6 unchanged lines hidden (view full) --- 212 if (rh0->ip6r0_slmap[index / 8] & (1 << (7 - (index % 8)))) 213 ip6_forward(m, IPV6_SRCRT_NEIGHBOR); 214 else 215 ip6_forward(m, IPV6_SRCRT_NOTNEIGHBOR); 216#else 217 ip6_forward(m, 1); 218#endif 219 |
220 return(-1); /* m would be freed in ip6_forward() */ | 220 return (-1); /* m would be freed in ip6_forward() */ |
221} | 221} |