annotate packages/net/common/current/src/ipv6_routing_thread.c @ 3292:7f8e529b4d82 default tip

Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
author vae
date Wed, 29 Apr 2015 23:31:48 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
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
fddabea2836c * src/ipv6_routing_thread.c: Fix compiler warnings
asl
parents: 1007
diff changeset
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
fddabea2836c * src/ipv6_routing_thread.c: Fix compiler warnings
asl
parents: 1007
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
57 void _show_all_interfaces(void);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
58
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
59 //#define DBG_PRINT 1
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
62 #define STACK_SIZE CYGNUM_HAL_STACK_SIZE_TYPICAL+2048
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
63 #define _1_MILLION 1000000
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
64 #define STATE_DELAY 0
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
65 #define STATE_PROBE 1
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
66 #define STATE_IDLE 2
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
67
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
68 #define MAX_RTR_SOLICITATIONS 3
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
69 #define SEL_TIMEOUT_IDLE 145
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
70 #define SECONDS_TILL_RS_SEND (12*60*60)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
75 static int s;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
76 static int probe=0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
77 static int racount=0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
78 static int state;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
79 static int badra;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
80 static int cc = sizeof(struct icmp6_hdr);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
81 static u_char outpack[sizeof(struct icmp6_hdr)];
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
82 struct sockaddr_in6 to;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
83 static struct timeval select_timeout;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
84 static struct timeval last_ra_time;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
85 static struct timeval idle_expire;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
86 static struct icmp6stat *istat;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
87 extern struct icmp6stat cyg_icmp6stat;
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
88 static struct sockaddr_in6 router;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
89 static int router_valid = 0;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
90
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
91 // Return the address of the last router to send us a router advertisement
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
92 // Copy the address into addr and return true. If we have not received an
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
93 // advertisement yet, return false
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
94 int cyg_net_get_ipv6_advrouter(struct sockaddr_in6 * addr) {
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
95
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
96 if (addr) {
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
97 memcpy(addr,&router,sizeof(*addr));
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
98 }
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
99 return router_valid;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
105 diag_printf("<%s>\n", __FUNCTION__);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
106 cyg_thread_exit();
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
107 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
108
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
109 static void
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
110 dprnt(const char *msg, ...)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
111 {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
112 #ifdef DBG_PRINT
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
113 va_list ap;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
114
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
115 va_start(ap, msg);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
116 (void) vfprintf(stdout, msg, ap);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
117 (void) fprintf(stdout, "\n");
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
118 va_end(ap);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
119 #endif
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
120 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
121
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
122 #ifdef DBG_PRINT
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
123 void
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
124 sleep_msg(char *str, int total)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
125 {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
126 int hours, minutes;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
127
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
128 hours = total / 3600;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
129 total -= hours * 3600;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
130 minutes = total / 60;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
131 total -= minutes * 60;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
132
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
133 if (hours > 0)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
134 dprnt("%s: %d hr, %d min", str, hours, minutes);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
135 else if (minutes > 0)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
136 dprnt("%s: %d min, %d sec", str, minutes, total);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
137 else
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
138 dprnt("%s: %d sec", str, total);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
139 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
140 #endif
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
141
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
142 void
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
143 get_realtime(struct timeval *now)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
144 {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
145 struct timespec tp;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
146 clock_gettime(CLOCK_REALTIME, &tp);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
147 now->tv_sec = tp.tv_sec;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
148 now->tv_usec = 0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
149 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
150
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
151 void
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
152 send_rs_packet(void)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
153 {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
154 probe++;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
155
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
156 dprnt("%s: probe=%d", __FUNCTION__, probe);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
157
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
158 if (sendto(s, outpack, cc, 0, (struct sockaddr *)&to, to.sin6_len) < 0) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
159 dprnt("%s: can't send RS: %s", __FUNCTION__, strerror(errno));
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
160 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
161 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
162
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
163 void
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
164 receive_ra_packet(void)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
165 {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
166 int len;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
167 char msg[1024];
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
168 struct nd_router_advert *advert;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
169 cyg_uint8 *opts;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
170 int optlen;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
171 int addrlen = sizeof(router);
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
172 char buf[64];
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
173
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
174 dprnt("%s", __FUNCTION__);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
175
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
176 len = recvfrom(s, msg, sizeof(msg),0,(struct sockaddr *)&router,&addrlen);
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
177 if (len < 0) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
178 dprnt(" Can't read RA data: %s", strerror(errno));
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
179 return;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
180 }
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
181 router_valid = 1;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
182
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
183 inet_ntop(AF_INET6,(void *)&router.sin6_addr,buf,64);
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
184 dprnt("Router Advertisement from %s",buf);
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
185 dprnt("packet data (buf len=%d) :", len);
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
186 #ifdef DBG_PRINT
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
187 diag_dump_buf(msg, len);
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
188 #endif
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
189
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
190 advert = (struct nd_router_advert *)msg;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
191
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
192 dprnt("AdvCurHopLimit: %d", (int) advert->nd_ra_curhoplimit);
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
193 dprnt("AdvManagedFlag: %s",
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
194 (advert->nd_ra_flags_reserved & ND_RA_FLAG_MANAGED) ? "yes" : "no");
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
195 dprnt("AdvOtherConfigFlag: %s",
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
196 (advert->nd_ra_flags_reserved & ND_RA_FLAG_OTHER) ? "yes":"no");
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
197 dprnt("AdvHomeAgentFlag: %s",
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
198 (advert->nd_ra_flags_reserved & ND_RA_FLAG_HOME_AGENT) ?
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
199 "yes" : "no");
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
200 dprnt("AdvReachableTime: %lu",
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
201 (unsigned long)ntohl(advert->nd_ra_reachable));
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
202 dprnt("AdvRetransTimer: %lu",
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
203 (unsigned long)ntohl(advert->nd_ra_retransmit));
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
204
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
205 // Now process the optinal fields
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
206 len -= sizeof(*advert);
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
207 opts = (cyg_uint8 *)(msg + sizeof(struct nd_router_advert));
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
208
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
209 while (len > 0) {
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
210 optlen = (opts[1] << 3);
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
211 switch (*opts) {
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
212 case ND_OPT_MTU: {
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
213 struct nd_opt_mtu *mtu = (struct nd_opt_mtu *) opts;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
214
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
215 dprnt("AdvLinkMTU: %lu",
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
216 (unsigned long)ntohl(mtu->nd_opt_mtu_mtu));
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
217 break;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
218 }
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
219 case ND_OPT_PREFIX_INFORMATION: {
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
220 struct nd_opt_prefix_info *pinfo = (struct nd_opt_prefix_info *) opts;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
221
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
222 inet_ntop(AF_INET6,(void *)&pinfo->nd_opt_pi_prefix,buf,64);
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
223 dprnt("Prefix: %s/%d",buf,pinfo->nd_opt_pi_prefix_len);
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
224 break;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
225 }
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
226 case ND_OPT_SOURCE_LINKADDR: {
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
227 char *cp = buf;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
228 int i;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
229
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
230 for (i = 2 ; i < optlen ; i++) {
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
231 cp += diag_sprintf(cp,"%02x ", (unsigned int) opts[i]);
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
232 }
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
233
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
234 dprnt("AdvSourceLinkAddress: %s",buf);
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
235 break;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
236 }
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
237 case ND_OPT_ADVINTERVAL:
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
238 case ND_OPT_HOMEAGENT_INFO:
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
239 dprnt("Mobile IPv6 entension options (not decoded)");
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
240 break;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
241 default:
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
242 dprnt("Unknown option %d\n", (int)*opts);
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
243 break;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
244 }
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
245 len -= optlen;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
246 opts += optlen;
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
247 }
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
248
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
249 racount++;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
250 get_realtime(&last_ra_time);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
251 dprnt("racount=%d, timestamp=%d sec",
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
252 racount, last_ra_time.tv_sec);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
253
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
254 if (badra != istat->icp6s_badra) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
255 /* BAD RA received by ipv6 stack (nd6_ra_input).
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
256 Resend RS packet. */
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
257 badra = istat->icp6s_badra;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
258 dprnt("<Bad RA (Router Advertisement)>");
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
259 return;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
260 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
261 /* Check the ICMPv6 RA Code */
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
262 if (msg[1] != 0) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
263 len = (int)msg[1];
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
264 dprnt("<Bad ICMPv6 Code: %d>", len);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
265 return;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
266 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
267
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
268 /* RA received, go idle for SECONDS_TILL_RS_SEND */
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
269 idle_expire.tv_sec = last_ra_time.tv_sec +
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
270 SECONDS_TILL_RS_SEND;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
271 probe = 0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
272 select_timeout.tv_sec = SEL_TIMEOUT_IDLE;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
273 if (state != STATE_IDLE)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
274 dprnt("Going IDLE, thread listening");
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
275 state = STATE_IDLE;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
276 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
277
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
278 void
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
279 check_timer(void)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
280 {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
281 struct timeval now;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
282
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
283 if (state == STATE_DELAY) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
284 probe = 0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
285 select_timeout.tv_sec = RTR_SOLICITATION_INTERVAL;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
286 state = STATE_PROBE;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
287 send_rs_packet();
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
288 } else if (state == STATE_PROBE) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
289 dprnt("%s: state: PROBE", __FUNCTION__);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
290 if (probe < MAX_RTR_SOLICITATIONS) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
291 send_rs_packet();
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
292 } else {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
293 dprnt("Maximum %d rtr solicitations sent out",
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
294 MAX_RTR_SOLICITATIONS);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
295 get_realtime(&now);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
296 probe = 0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
297 idle_expire.tv_sec = now.tv_sec +
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
298 SECONDS_TILL_RS_SEND;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
299 dprnt("Going IDLE");
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
300 select_timeout.tv_sec = SEL_TIMEOUT_IDLE;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
301 state = STATE_IDLE;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
302 #ifdef DBG_PRINT
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
303 sleep_msg("Thread listening (state=IDLE)",
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
304 SECONDS_TILL_RS_SEND);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
305 #endif
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
306 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
307 } else {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
308 /* STATE_IDLE */
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
309 get_realtime(&now);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
310 if (now.tv_sec >= idle_expire.tv_sec) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
311 dprnt("<Leaving IDLE; Woke up to retry RS send>");
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
312 select_timeout.tv_sec = 1;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
313 state = STATE_DELAY;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
314 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
315 #ifdef DBG_PRINT
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
316 else if ((idle_expire.tv_sec - now.tv_sec) < (5 * 60)) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
317 sleep_msg("Coming out of IDLE in",
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
318 idle_expire.tv_sec - now.tv_sec);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
319 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
320 #endif
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
327 struct addrinfo hints, *res;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
328 struct icmp6_hdr *icp;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
329 struct icmp6_filter filt;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
330 struct timeval loop_delay;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
331 int err, status;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
332 u_int hlim = 255;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
333 fd_set fdset;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
334
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
335 #ifdef DBG_PRINT
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
336 _show_all_interfaces();
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
337 #endif
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
338
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
339 memset(&hints, 0, sizeof(hints));
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
342 err = getaddrinfo(ALLROUTER, NULL, &hints, &res);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
343 if (err) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
344 dprnt("%s - failed to get ALL ROUTER: %s",
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
345 __FUNCTION__, gai_strerror(err));
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
346 cyg_rs_exit();
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
347 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
348 memcpy(&to, res->ai_addr, res->ai_addrlen);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
349 *(u_int16_t *)&to.sin6_addr.s6_addr[2] = htons(1);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
350
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
351 if ((s = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
352 dprnt("%s - can't open socket: %s",
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
353 __FUNCTION__, strerror(errno));
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
354 cyg_rs_exit();
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
355 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
356 if (setsockopt(s, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
357 &hlim, sizeof(hlim)) < 0) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
358 dprnt("%s - can't set IPV6 MULTICAST HOPS: %s",
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
359 __FUNCTION__, strerror(errno));
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
360 cyg_rs_exit();
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
361 }
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
362
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
363 /* Specify to accept only router advertisements on the socket */
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
364 ICMP6_FILTER_SETBLOCKALL(&filt);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
365 ICMP6_FILTER_SETPASS(ND_ROUTER_ADVERT, &filt);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
366 if (setsockopt(s, IPPROTO_ICMPV6, ICMP6_FILTER,
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
367 &filt, sizeof(filt)) < 0) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
368 dprnt("%s - can't set ICMP6 filter: %s",
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
369 __FUNCTION__, strerror(errno));
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
370 cyg_rs_exit();
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
371 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
372
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
373 idle_expire.tv_usec = 0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
374 select_timeout.tv_usec = 0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
375 last_ra_time.tv_usec = 0;
957
db3e0a2fda2f 2003-04-12 Andrew Lunn <andrew.lunn@ascom.ch>
asl
parents: 300
diff changeset
376 last_ra_time.tv_sec = 2;
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
379 racount = 0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
380 istat = &(cyg_icmp6stat);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
381 badra = istat->icp6s_badra;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
382
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
383 icp = (struct icmp6_hdr *)outpack;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
384 icp->icmp6_type = ND_ROUTER_SOLICIT;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
385 icp->icmp6_code = 0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
386 icp->icmp6_cksum = 0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
387 icp->icmp6_data32[0] = 0; /* RS reserved field */
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
388 state = STATE_DELAY;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
389
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
390 while (true) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
391 FD_ZERO(&fdset);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
392 FD_SET(s, &fdset);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
393
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
394 check_timer();
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
395
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
396 status = select(s + 1, &fdset, NULL, NULL, &select_timeout);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
397 if (status < 0) {
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
398 dprnt("%s - select: %s", strerror(errno));
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
399 continue;
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
diff changeset
400 }
300
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
401 if (status == 1)
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
404 loop_delay.tv_sec = 2;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
405 loop_delay.tv_usec = 0;
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
406 select(0, 0, 0, 0, &loop_delay);
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
407 }
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
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
58c748750ca6 Improve IPv6 routing.
gthomas
parents: 208
diff changeset
434
1007
16d247bb9c70 * src/ifaddrs.c (getifaddrs): Fill in flags, netmask and broadcast
asl
parents: 957
diff changeset
435