This source file includes following definitions.
- atm_rtrequest
- atmresolve
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 #if defined(INET) || defined(INET6)
40
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/malloc.h>
44 #include <sys/mbuf.h>
45 #include <sys/socket.h>
46 #include <sys/time.h>
47 #include <sys/kernel.h>
48 #include <sys/errno.h>
49 #include <sys/ioctl.h>
50 #include <sys/syslog.h>
51 #include <sys/proc.h>
52
53 #include <net/if.h>
54 #include <net/if_dl.h>
55 #include <net/route.h>
56 #include <net/if_atm.h>
57
58 #include <netinet/in.h>
59 #include <netinet/in_systm.h>
60 #include <netinet/in_var.h>
61 #include <netinet/ip.h>
62 #include <netinet/if_atm.h>
63
64 #ifdef NATM
65 #include <netnatm/natm.h>
66 #endif
67
68
69 #define SDL(s) ((struct sockaddr_dl *)s)
70
71
72
73
74
75
76
77
78 void
79 atm_rtrequest(req, rt, info)
80 int req;
81 struct rtentry *rt;
82 struct rt_addrinfo *info;
83 {
84 struct sockaddr *gate = rt->rt_gateway;
85 struct atm_pseudoioctl api;
86 #ifdef NATM
87 struct sockaddr_in *sin;
88 struct natmpcb *npcb = NULL;
89 struct atm_pseudohdr *aph;
90 #endif
91 static struct sockaddr_dl null_sdl = {sizeof(null_sdl), AF_LINK};
92
93 if (rt->rt_flags & RTF_GATEWAY)
94 return;
95
96 switch (req) {
97
98 case RTM_RESOLVE:
99 printf("atm_rtrequest: RTM_RESOLVE request detected?\n");
100 break;
101
102 case RTM_ADD:
103
104
105
106
107
108
109
110
111 if ((rt->rt_flags & RTF_HOST) == 0) {
112 rt_setgate(rt,rt_key(rt),(struct sockaddr *)&null_sdl, 0);
113 gate = rt->rt_gateway;
114 SDL(gate)->sdl_type = rt->rt_ifp->if_type;
115 SDL(gate)->sdl_index = rt->rt_ifp->if_index;
116 break;
117 }
118
119 if ((rt->rt_flags & RTF_CLONING) != 0) {
120 printf("atm_rtrequest: cloning route detected?\n");
121 break;
122 }
123 if (gate->sa_family != AF_LINK ||
124 gate->sa_len < sizeof(null_sdl)) {
125 log(LOG_DEBUG, "atm_rtrequest: bad gateway value\n");
126 break;
127 }
128
129 #ifdef DIAGNOSTIC
130 if (rt->rt_ifp->if_ioctl == NULL) panic("atm null ioctl");
131 #endif
132
133 #ifdef NATM
134
135
136
137
138 sin = (struct sockaddr_in *) rt_key(rt);
139 if (sin->sin_family != AF_INET)
140 goto failed;
141 aph = (struct atm_pseudohdr *) LLADDR(SDL(gate));
142 npcb = npcb_add(NULL, rt->rt_ifp, ATM_PH_VCI(aph),
143 ATM_PH_VPI(aph));
144 if (npcb == NULL)
145 goto failed;
146 npcb->npcb_flags |= NPCB_IP;
147 npcb->ipaddr.s_addr = sin->sin_addr.s_addr;
148
149 rt->rt_llinfo = (caddr_t) npcb;
150 rt->rt_flags |= RTF_LLINFO;
151 #endif
152
153
154
155 bcopy(LLADDR(SDL(gate)), &api.aph, sizeof(api.aph));
156 api.rxhand = NULL;
157 if (rt->rt_ifp->if_ioctl(rt->rt_ifp, SIOCATMENA,
158 (caddr_t)&api) != 0) {
159 printf("atm: couldn't add VC\n");
160 goto failed;
161 }
162
163 SDL(gate)->sdl_type = rt->rt_ifp->if_type;
164 SDL(gate)->sdl_index = rt->rt_ifp->if_index;
165
166 break;
167
168 failed:
169 #ifdef NATM
170 if (npcb) {
171 npcb_free(npcb, NPCB_DESTROY);
172 rt->rt_llinfo = NULL;
173 rt->rt_flags &= ~RTF_LLINFO;
174 }
175 #endif
176 rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0,
177 rt_mask(rt), 0, (struct rtentry **) 0, 0);
178 break;
179
180 case RTM_DELETE:
181
182 #ifdef NATM
183
184
185
186
187 if (rt->rt_flags & RTF_LLINFO) {
188 npcb_free((struct natmpcb *)rt->rt_llinfo,
189 NPCB_DESTROY);
190 rt->rt_llinfo = NULL;
191 rt->rt_flags &= ~RTF_LLINFO;
192 }
193 #endif
194
195
196
197
198 bcopy(LLADDR(SDL(gate)), &api.aph, sizeof(api.aph));
199 api.rxhand = NULL;
200 (void)rt->rt_ifp->if_ioctl(rt->rt_ifp, SIOCATMDIS,
201 (caddr_t)&api);
202
203 break;
204 }
205 }
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223 int
224 atmresolve(rt, m, dst, desten)
225 struct rtentry *rt;
226 struct mbuf *m;
227 struct sockaddr *dst;
228 struct atm_pseudohdr *desten;
229 {
230 struct sockaddr_dl *sdl;
231
232 if (m->m_flags & (M_BCAST|M_MCAST)) {
233 log(LOG_INFO,
234 "atmresolve: BCAST/MCAST packet detected/dumped\n");
235 goto bad;
236 }
237
238 if (rt == NULL) {
239 rt = RTALLOC1(dst, 0);
240 if (rt == NULL) goto bad;
241 rt->rt_refcnt--;
242 if ((rt->rt_flags & RTF_GATEWAY) != 0 ||
243 (rt->rt_flags & RTF_LLINFO) == 0 ||
244
245 rt->rt_gateway->sa_family != AF_LINK) {
246 goto bad;
247 }
248 }
249
250
251
252
253
254
255
256
257 sdl = SDL(rt->rt_gateway);
258
259
260
261
262
263
264
265 if (sdl->sdl_family == AF_LINK && sdl->sdl_alen == sizeof(*desten)) {
266 bcopy(LLADDR(sdl), desten, sdl->sdl_alen);
267 return (1);
268 }
269
270
271
272
273
274
275
276 bad:
277 m_freem(m);
278 return (0);
279 }
280 #endif