annotate packages/net/common/current/src/ipv6_routing_thread.c @ 1777:c16341b1bac6 default tip

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