Mercurial > ecos
annotate packages/net/common/current/src/ipv6_routing_thread.c @ 2729:74dbf4c3f2e1 after-copyright-change-20090129
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
| author | jlarmour |
|---|---|
| date | Thu, 29 Jan 2009 17:47:46 +0000 |
| parents | fddabea2836c |
| children |
| rev | line source |
|---|---|
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
1 //========================================================================== |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
2 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
3 // ipv6_routing_thread.c |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
4 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
5 // IPv6 routing support |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
6 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
7 //========================================================================== |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1146
diff
changeset
|
8 // ####BSDALTCOPYRIGHTBEGIN#### |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1146
diff
changeset
|
9 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1146
diff
changeset
|
10 // Portions of this software may have been derived from FreeBSD, OpenBSD, |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1146
diff
changeset
|
11 // or other sources, and if so are covered by the appropriate copyright |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1146
diff
changeset
|
12 // and license included herein. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1146
diff
changeset
|
13 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1146
diff
changeset
|
14 // ####BSDALTCOPYRIGHTEND#### |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
15 //========================================================================== |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
16 //#####DESCRIPTIONBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
17 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
18 // Author(s): gthomas |
| 957 | 19 // Contributors: gthomas, lhamilton, andrew.lunn@ascom.ch |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
20 // Date: 2002-04-16 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
21 // Purpose: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
22 // Description: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
23 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
24 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
25 //####DESCRIPTIONEND#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
26 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
27 //========================================================================== |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
28 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
29 // IPv6 routing support |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
30 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
31 #include <pkgconf/net.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
32 #undef _KERNEL |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
33 #include <sys/param.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
34 #include <sys/types.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
35 #include <sys/ioctl.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
36 #include <sys/socket.h> |
| 1146 | 37 #include <sys/select.h> |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
38 #include <errno.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
39 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
40 #include <cyg/kernel/kapi.h> |
| 1146 | 41 #include <cyg/infra/diag.h> |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
42 #include <net/if.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
43 #include <ifaddrs.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
44 #include <net/if_var.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
45 #include <netinet/in.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
46 #include <netinet/ip6.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
47 #include <netinet/icmp6.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
48 #include <netdb.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
49 #include <netinet6/in6_var.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
50 #include <netinet6/nd6.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
51 |
| 300 | 52 #include <stdio.h> |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
53 #include <unistd.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
54 #include <stdlib.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
55 #include <string.h> |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
56 |
| 300 | 57 void _show_all_interfaces(void); |
| 58 | |
| 957 | 59 //#define DBG_PRINT 1 |
| 300 | 60 #define ALLROUTER "ff02::2" |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
61 |
| 300 | 62 #define STACK_SIZE CYGNUM_HAL_STACK_SIZE_TYPICAL+2048 |
| 63 #define _1_MILLION 1000000 | |
| 64 #define STATE_DELAY 0 | |
| 65 #define STATE_PROBE 1 | |
| 66 #define STATE_IDLE 2 | |
| 67 | |
| 68 #define MAX_RTR_SOLICITATIONS 3 | |
| 69 #define SEL_TIMEOUT_IDLE 145 | |
| 70 #define SECONDS_TILL_RS_SEND (12*60*60) | |
| 71 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
72 static char rs_stack[STACK_SIZE]; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
73 static cyg_thread rs_thread_data; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
74 static cyg_handle_t rs_thread_handle; |
| 300 | 75 static int s; |
| 76 static int probe=0; | |
| 77 static int racount=0; | |
| 78 static int state; | |
| 79 static int badra; | |
| 80 static int cc = sizeof(struct icmp6_hdr); | |
| 81 static u_char outpack[sizeof(struct icmp6_hdr)]; | |
| 82 struct sockaddr_in6 to; | |
| 83 static struct timeval select_timeout; | |
| 84 static struct timeval last_ra_time; | |
| 85 static struct timeval idle_expire; | |
| 86 static struct icmp6stat *istat; | |
| 87 extern struct icmp6stat cyg_icmp6stat; | |
| 957 | 88 static struct sockaddr_in6 router; |
| 89 static int router_valid = 0; | |
| 90 | |
| 91 // Return the address of the last router to send us a router advertisement | |
| 92 // Copy the address into addr and return true. If we have not received an | |
| 93 // advertisement yet, return false | |
| 94 int cyg_net_get_ipv6_advrouter(struct sockaddr_in6 * addr) { | |
| 95 | |
| 96 if (addr) { | |
| 97 memcpy(addr,&router,sizeof(*addr)); | |
| 98 } | |
| 99 return router_valid; | |
| 100 } | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
101 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
102 static void |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
103 cyg_rs_exit(void) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
104 { |
| 300 | 105 diag_printf("<%s>\n", __FUNCTION__); |
| 106 cyg_thread_exit(); | |
| 107 } | |
| 108 | |
| 109 static void | |
| 110 dprnt(const char *msg, ...) | |
| 111 { | |
| 112 #ifdef DBG_PRINT | |
| 113 va_list ap; | |
| 114 | |
| 115 va_start(ap, msg); | |
| 116 (void) vfprintf(stdout, msg, ap); | |
| 117 (void) fprintf(stdout, "\n"); | |
| 118 va_end(ap); | |
| 119 #endif | |
| 120 } | |
| 121 | |
| 122 #ifdef DBG_PRINT | |
| 123 void | |
| 124 sleep_msg(char *str, int total) | |
| 125 { | |
| 126 int hours, minutes; | |
| 127 | |
| 128 hours = total / 3600; | |
| 129 total -= hours * 3600; | |
| 130 minutes = total / 60; | |
| 131 total -= minutes * 60; | |
| 132 | |
| 133 if (hours > 0) | |
| 134 dprnt("%s: %d hr, %d min", str, hours, minutes); | |
| 135 else if (minutes > 0) | |
| 136 dprnt("%s: %d min, %d sec", str, minutes, total); | |
| 137 else | |
| 138 dprnt("%s: %d sec", str, total); | |
| 139 } | |
| 140 #endif | |
| 141 | |
| 142 void | |
| 143 get_realtime(struct timeval *now) | |
| 144 { | |
| 145 struct timespec tp; | |
| 146 clock_gettime(CLOCK_REALTIME, &tp); | |
| 147 now->tv_sec = tp.tv_sec; | |
| 148 now->tv_usec = 0; | |
| 149 } | |
| 150 | |
| 151 void | |
| 152 send_rs_packet(void) | |
| 153 { | |
| 154 probe++; | |
| 155 | |
| 156 dprnt("%s: probe=%d", __FUNCTION__, probe); | |
| 157 | |
| 158 if (sendto(s, outpack, cc, 0, (struct sockaddr *)&to, to.sin6_len) < 0) { | |
| 159 dprnt("%s: can't send RS: %s", __FUNCTION__, strerror(errno)); | |
| 160 } | |
| 161 } | |
| 162 | |
| 163 void | |
| 164 receive_ra_packet(void) | |
| 165 { | |
| 166 int len; | |
| 167 char msg[1024]; | |
| 957 | 168 struct nd_router_advert *advert; |
| 169 cyg_uint8 *opts; | |
| 170 int optlen; | |
| 171 int addrlen = sizeof(router); | |
| 172 char buf[64]; | |
| 300 | 173 |
| 174 dprnt("%s", __FUNCTION__); | |
| 175 | |
| 957 | 176 len = recvfrom(s, msg, sizeof(msg),0,(struct sockaddr *)&router,&addrlen); |
| 300 | 177 if (len < 0) { |
| 178 dprnt(" Can't read RA data: %s", strerror(errno)); | |
| 179 return; | |
| 180 } | |
| 957 | 181 router_valid = 1; |
| 182 | |
| 183 inet_ntop(AF_INET6,(void *)&router.sin6_addr,buf,64); | |
| 184 dprnt("Router Advertisement from %s",buf); | |
| 300 | 185 dprnt("packet data (buf len=%d) :", len); |
| 957 | 186 #ifdef DBG_PRINT |
| 300 | 187 diag_dump_buf(msg, len); |
| 957 | 188 #endif |
| 300 | 189 |
| 957 | 190 advert = (struct nd_router_advert *)msg; |
| 191 | |
| 192 dprnt("AdvCurHopLimit: %d", (int) advert->nd_ra_curhoplimit); | |
| 193 dprnt("AdvManagedFlag: %s", | |
| 194 (advert->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED) ? "yes" : "no"); | |
| 195 dprnt("AdvOtherConfigFlag: %s", | |
| 196 (advert->nd_ra_flags_reserved & ND_RA_FLAG_OTHER) ? "yes":"no"); | |
| 197 dprnt("AdvHomeAgentFlag: %s", | |
| 198 (advert->nd_ra_flags_reserved & ND_RA_FLAG_HOME_AGENT) ? | |
| 199 "yes" : "no"); | |
| 200 dprnt("AdvReachableTime: %lu", | |
| 201 (unsigned long)ntohl(advert->nd_ra_reachable)); | |
| 202 dprnt("AdvRetransTimer: %lu", | |
| 203 (unsigned long)ntohl(advert->nd_ra_retransmit)); | |
| 204 | |
| 205 // Now process the optinal fields | |
| 206 len -= sizeof(*advert); | |
| 207 opts = (cyg_uint8 *)(msg + sizeof(struct nd_router_advert)); | |
| 208 | |
| 209 while (len > 0) { | |
| 210 optlen = (opts[1] << 3); | |
| 211 switch (*opts) { | |
| 212 case ND_OPT_MTU: { | |
| 213 struct nd_opt_mtu *mtu = (struct nd_opt_mtu *) opts; | |
| 214 | |
| 215 dprnt("AdvLinkMTU: %lu", | |
| 216 (unsigned long)ntohl(mtu->nd_opt_mtu_mtu)); | |
| 217 break; | |
| 218 } | |
| 219 case ND_OPT_PREFIX_INFORMATION: { | |
| 220 struct nd_opt_prefix_info *pinfo = (struct nd_opt_prefix_info *) opts; | |
| 221 | |
| 222 inet_ntop(AF_INET6,(void *)&pinfo->nd_opt_pi_prefix,buf,64); | |
| 223 dprnt("Prefix: %s/%d",buf,pinfo->nd_opt_pi_prefix_len); | |
| 224 break; | |
| 225 } | |
| 226 case ND_OPT_SOURCE_LINKADDR: { | |
| 227 char *cp = buf; | |
| 228 int i; | |
| 229 | |
| 230 for (i = 2 ; i < optlen ; i++) { | |
| 231 cp += diag_sprintf(cp,"%02x ", (unsigned int) opts[i]); | |
| 232 } | |
| 233 | |
| 234 dprnt("AdvSourceLinkAddress: %s",buf); | |
| 235 break; | |
| 236 } | |
| 237 case ND_OPT_ADVINTERVAL: | |
| 238 case ND_OPT_HOMEAGENT_INFO: | |
| 239 dprnt("Mobile IPv6 entension options (not decoded)"); | |
| 240 break; | |
| 241 default: | |
| 242 dprnt("Unknown option %d\n", (int)*opts); | |
| 243 break; | |
| 244 } | |
| 245 len -= optlen; | |
| 246 opts += optlen; | |
| 247 } | |
| 248 | |
| 300 | 249 racount++; |
| 250 get_realtime(&last_ra_time); | |
| 251 dprnt("racount=%d, timestamp=%d sec", | |
| 252 racount, last_ra_time.tv_sec); | |
| 253 | |
| 254 if (badra != istat->icp6s_badra) { | |
| 255 /* BAD RA received by ipv6 stack (nd6_ra_input). | |
| 256 Resend RS packet. */ | |
| 257 badra = istat->icp6s_badra; | |
| 258 dprnt("<Bad RA (Router Advertisement)>"); | |
| 259 return; | |
| 260 } | |
| 261 /* Check the ICMPv6 RA Code */ | |
| 262 if (msg[1] != 0) { | |
| 263 len = (int)msg[1]; | |
| 264 dprnt("<Bad ICMPv6 Code: %d>", len); | |
| 265 return; | |
| 266 } | |
| 267 | |
| 268 /* RA received, go idle for SECONDS_TILL_RS_SEND */ | |
| 269 idle_expire.tv_sec = last_ra_time.tv_sec + | |
| 270 SECONDS_TILL_RS_SEND; | |
| 271 probe = 0; | |
| 272 select_timeout.tv_sec = SEL_TIMEOUT_IDLE; | |
| 273 if (state != STATE_IDLE) | |
| 274 dprnt("Going IDLE, thread listening"); | |
| 275 state = STATE_IDLE; | |
| 276 } | |
| 277 | |
| 278 void | |
| 279 check_timer(void) | |
| 280 { | |
| 281 struct timeval now; | |
| 282 | |
| 283 if (state == STATE_DELAY) { | |
| 284 probe = 0; | |
| 285 select_timeout.tv_sec = RTR_SOLICITATION_INTERVAL; | |
| 286 state = STATE_PROBE; | |
| 287 send_rs_packet(); | |
| 288 } else if (state == STATE_PROBE) { | |
| 289 dprnt("%s: state: PROBE", __FUNCTION__); | |
| 290 if (probe < MAX_RTR_SOLICITATIONS) { | |
| 291 send_rs_packet(); | |
| 292 } else { | |
| 293 dprnt("Maximum %d rtr solicitations sent out", | |
| 294 MAX_RTR_SOLICITATIONS); | |
| 295 get_realtime(&now); | |
| 296 probe = 0; | |
| 297 idle_expire.tv_sec = now.tv_sec + | |
| 298 SECONDS_TILL_RS_SEND; | |
| 299 dprnt("Going IDLE"); | |
| 300 select_timeout.tv_sec = SEL_TIMEOUT_IDLE; | |
| 301 state = STATE_IDLE; | |
| 302 #ifdef DBG_PRINT | |
| 303 sleep_msg("Thread listening (state=IDLE)", | |
| 304 SECONDS_TILL_RS_SEND); | |
| 305 #endif | |
| 306 } | |
| 307 } else { | |
| 308 /* STATE_IDLE */ | |
| 309 get_realtime(&now); | |
| 310 if (now.tv_sec >= idle_expire.tv_sec) { | |
| 311 dprnt("<Leaving IDLE; Woke up to retry RS send>"); | |
| 312 select_timeout.tv_sec = 1; | |
| 313 state = STATE_DELAY; | |
| 314 } | |
| 315 #ifdef DBG_PRINT | |
| 316 else if ((idle_expire.tv_sec - now.tv_sec) < (5 * 60)) { | |
| 317 sleep_msg("Coming out of IDLE in", | |
| 318 idle_expire.tv_sec - now.tv_sec); | |
| 319 } | |
| 320 #endif | |
| 321 } | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
322 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
323 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
324 static void |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
325 cyg_rs(cyg_addrword_t param) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
326 { |
| 300 | 327 struct addrinfo hints, *res; |
| 328 struct icmp6_hdr *icp; | |
| 329 struct icmp6_filter filt; | |
| 330 struct timeval loop_delay; | |
| 331 int err, status; | |
| 332 u_int hlim = 255; | |
| 333 fd_set fdset; | |
| 334 | |
| 957 | 335 #ifdef DBG_PRINT |
| 300 | 336 _show_all_interfaces(); |
| 957 | 337 #endif |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
338 |
| 300 | 339 memset(&hints, 0, sizeof(hints)); |
| 340 hints.ai_family = AF_INET6; | |
|
1007
16d247bb9c70
* src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents:
957
diff
changeset
|
341 hints.ai_flags = AI_NUMERICHOST; |
| 300 | 342 err = getaddrinfo(ALLROUTER, NULL, &hints, &res); |
| 343 if (err) { | |
| 344 dprnt("%s - failed to get ALL ROUTER: %s", | |
| 345 __FUNCTION__, gai_strerror(err)); | |
| 346 cyg_rs_exit(); | |
| 347 } | |
| 348 memcpy(&to, res->ai_addr, res->ai_addrlen); | |
| 349 *(u_int16_t *)&to.sin6_addr.s6_addr[2] = htons(1); | |
| 350 | |
| 351 if ((s = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) { | |
| 352 dprnt("%s - can't open socket: %s", | |
| 353 __FUNCTION__, strerror(errno)); | |
| 354 cyg_rs_exit(); | |
| 355 } | |
| 356 if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, | |
| 357 &hlim, sizeof(hlim)) < 0) { | |
| 358 dprnt("%s - can't set IPV6 MULTICAST HOPS: %s", | |
| 359 __FUNCTION__, strerror(errno)); | |
| 360 cyg_rs_exit(); | |
| 361 } | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
362 |
| 300 | 363 /* Specify to accept only router advertisements on the socket */ |
| 364 ICMP6_FILTER_SETBLOCKALL(&filt); | |
| 365 ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filt); | |
| 366 if (setsockopt(s, IPPROTO_ICMPV6, ICMP6_FILTER, | |
| 367 &filt, sizeof(filt)) < 0) { | |
| 368 dprnt("%s - can't set ICMP6 filter: %s", | |
| 369 __FUNCTION__, strerror(errno)); | |
| 370 cyg_rs_exit(); | |
| 371 } | |
| 372 | |
| 373 idle_expire.tv_usec = 0; | |
| 374 select_timeout.tv_usec = 0; | |
| 375 last_ra_time.tv_usec = 0; | |
| 957 | 376 last_ra_time.tv_sec = 2; |
| 300 | 377 select(0, 0, 0, 0, &last_ra_time); |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
378 |
| 300 | 379 racount = 0; |
| 380 istat = &(cyg_icmp6stat); | |
| 381 badra = istat->icp6s_badra; | |
| 382 | |
| 383 icp = (struct icmp6_hdr *)outpack; | |
| 384 icp->icmp6_type = ND_ROUTER_SOLICIT; | |
| 385 icp->icmp6_code = 0; | |
| 386 icp->icmp6_cksum = 0; | |
| 387 icp->icmp6_data32[0] = 0; /* RS reserved field */ | |
| 388 state = STATE_DELAY; | |
| 389 | |
| 390 while (true) { | |
| 391 FD_ZERO(&fdset); | |
| 392 FD_SET(s, &fdset); | |
| 393 | |
| 394 check_timer(); | |
| 395 | |
| 396 status = select(s + 1, &fdset, NULL, NULL, &select_timeout); | |
| 397 if (status < 0) { | |
| 398 dprnt("%s - select: %s", strerror(errno)); | |
| 399 continue; | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
400 } |
| 300 | 401 if (status == 1) |
| 402 receive_ra_packet(); | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
403 |
| 300 | 404 loop_delay.tv_sec = 2; |
| 405 loop_delay.tv_usec = 0; | |
| 406 select(0, 0, 0, 0, &loop_delay); | |
| 407 } | |
| 408 /* NOTREACHED */ | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
409 } |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
410 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
411 void |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
412 ipv6_start_routing_thread(void) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
413 { |
|
1007
16d247bb9c70
* src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents:
957
diff
changeset
|
414 static int started = 0; |
|
16d247bb9c70
* src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents:
957
diff
changeset
|
415 |
|
16d247bb9c70
* src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents:
957
diff
changeset
|
416 started++; |
|
16d247bb9c70
* src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents:
957
diff
changeset
|
417 |
|
16d247bb9c70
* src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents:
957
diff
changeset
|
418 if (started == 1) { |
|
16d247bb9c70
* src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents:
957
diff
changeset
|
419 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
420 cyg_thread_create( |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
421 CYGINT_NET_IPV6_ROUTING_THREAD_PRIORITY, // Priority |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
422 cyg_rs, // entry |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
423 0, // parameter |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
424 "IPv6 routing", // Name |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
425 &rs_stack[0], // Stack |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
426 STACK_SIZE, // Size |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
427 &rs_thread_handle, // Handle |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
428 &rs_thread_data // Thread data structure |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
429 ); |
| 300 | 430 cyg_thread_resume(rs_thread_handle); // Start it |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
431 diag_printf("IPv6 routing thread started\n"); |
|
1007
16d247bb9c70
* src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents:
957
diff
changeset
|
432 } |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff
changeset
|
433 } |
| 300 | 434 |
|
1007
16d247bb9c70
* src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents:
957
diff
changeset
|
435 |
