Deleted Added
full compact
route.c (58031) route.c (58032)
1/*
2 * PPP Routing related Module
3 *
4 * Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5 *
6 * Copyright (C) 1994, Internet Initiative Japan, Inc. All rights reserverd.
7 *
8 * Redistribution and use in source and binary forms are permitted
9 * provided that the above copyright notice and this paragraph are
10 * duplicated in all such forms and that any documentation,
11 * advertising materials, and other materials related to such
12 * distribution and use acknowledge that the software was developed
13 * by the Internet Initiative Japan, Inc. The name of the
14 * IIJ may not be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19 *
1/*
2 * PPP Routing related Module
3 *
4 * Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5 *
6 * Copyright (C) 1994, Internet Initiative Japan, Inc. All rights reserverd.
7 *
8 * Redistribution and use in source and binary forms are permitted
9 * provided that the above copyright notice and this paragraph are
10 * duplicated in all such forms and that any documentation,
11 * advertising materials, and other materials related to such
12 * distribution and use acknowledge that the software was developed
13 * by the Internet Initiative Japan, Inc. The name of the
14 * IIJ may not be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19 *
20 * $FreeBSD: head/usr.sbin/ppp/route.c 58031 2000-03-14 01:46:38Z brian $
20 * $FreeBSD: head/usr.sbin/ppp/route.c 58032 2000-03-14 01:46:44Z brian $
21 *
22 */
23
24#include <sys/param.h>
25#include <sys/socket.h>
26#include <net/if_types.h>
27#include <net/route.h>
28#include <net/if.h>

--- 37 unchanged lines hidden (view full) ---

66#ifndef NORADIUS
67#include "radius.h"
68#endif
69#include "bundle.h"
70#include "route.h"
71#include "prompt.h"
72#include "iface.h"
73
21 *
22 */
23
24#include <sys/param.h>
25#include <sys/socket.h>
26#include <net/if_types.h>
27#include <net/route.h>
28#include <net/if.h>

--- 37 unchanged lines hidden (view full) ---

66#ifndef NORADIUS
67#include "radius.h"
68#endif
69#include "bundle.h"
70#include "route.h"
71#include "prompt.h"
72#include "iface.h"
73
74
74static void
75p_sockaddr(struct prompt *prompt, struct sockaddr *phost,
76 struct sockaddr *pmask, int width)
77{
78 char buf[29];
79 struct sockaddr_in *ihost4 = (struct sockaddr_in *)phost;
80 struct sockaddr_in *mask4 = (struct sockaddr_in *)pmask;
81 struct sockaddr_dl *dl = (struct sockaddr_dl *)phost;
82
83 if (log_IsKept(LogDEBUG)) {
84 char tmp[50];
85
86 log_Printf(LogDEBUG, "Found the following sockaddr:\n");
87 log_Printf(LogDEBUG, " Family %d, len %d\n",
88 (int)phost->sa_family, (int)phost->sa_len);
75static void
76p_sockaddr(struct prompt *prompt, struct sockaddr *phost,
77 struct sockaddr *pmask, int width)
78{
79 char buf[29];
80 struct sockaddr_in *ihost4 = (struct sockaddr_in *)phost;
81 struct sockaddr_in *mask4 = (struct sockaddr_in *)pmask;
82 struct sockaddr_dl *dl = (struct sockaddr_dl *)phost;
83
84 if (log_IsKept(LogDEBUG)) {
85 char tmp[50];
86
87 log_Printf(LogDEBUG, "Found the following sockaddr:\n");
88 log_Printf(LogDEBUG, " Family %d, len %d\n",
89 (int)phost->sa_family, (int)phost->sa_len);
89 inet_ntop(phost->sa_family, phost, tmp, sizeof tmp);
90 inet_ntop(phost->sa_family, phost->sa_data, tmp, sizeof tmp);
90 log_Printf(LogDEBUG, " Addr %s\n", tmp);
91 if (pmask) {
91 log_Printf(LogDEBUG, " Addr %s\n", tmp);
92 if (pmask) {
92 inet_ntop(pmask->sa_family, pmask, tmp, sizeof tmp);
93 inet_ntop(pmask->sa_family, pmask->sa_data, tmp, sizeof tmp);
93 log_Printf(LogDEBUG, " Mask %s\n", tmp);
94 }
95 }
96
97 switch (phost->sa_family) {
98 case AF_INET:
99 if (!phost)
100 buf[0] = '\0';

--- 206 unchanged lines hidden (view full) ---

307 free(buf);
308 return "???";
309 }
310 end = buf + needed;
311
312 have = 0;
313 for (ptr = buf; ptr < end; ptr += ifm->ifm_msglen) {
314 ifm = (struct if_msghdr *)ptr;
94 log_Printf(LogDEBUG, " Mask %s\n", tmp);
95 }
96 }
97
98 switch (phost->sa_family) {
99 case AF_INET:
100 if (!phost)
101 buf[0] = '\0';

--- 206 unchanged lines hidden (view full) ---

308 free(buf);
309 return "???";
310 }
311 end = buf + needed;
312
313 have = 0;
314 for (ptr = buf; ptr < end; ptr += ifm->ifm_msglen) {
315 ifm = (struct if_msghdr *)ptr;
316 if (ifm->ifm_type != RTM_IFINFO)
317 break;
315 dl = (struct sockaddr_dl *)(ifm + 1);
316 if (ifm->ifm_index > 0) {
317 if (ifm->ifm_index > have) {
318 char **newifs;
319
320 had = have;
321 have = ifm->ifm_index + 5;
322 if (had)

--- 38 unchanged lines hidden (view full) ---

361 }
362
363 if (idx < 1 || idx > nifs || ifs[idx-1] == NULL)
364 return "???";
365
366 return ifs[idx-1];
367}
368
318 dl = (struct sockaddr_dl *)(ifm + 1);
319 if (ifm->ifm_index > 0) {
320 if (ifm->ifm_index > have) {
321 char **newifs;
322
323 had = have;
324 have = ifm->ifm_index + 5;
325 if (had)

--- 38 unchanged lines hidden (view full) ---

364 }
365
366 if (idx < 1 || idx > nifs || ifs[idx-1] == NULL)
367 return "???";
368
369 return ifs[idx-1];
370}
371
372void
373route_ParseHdr(struct rt_msghdr *rtm, struct sockaddr *sa[RTAX_MAX])
374{
375 char *wp;
376 int rtax;
377
378 wp = (char *)(rtm + 1);
379
380 for (rtax = 0; rtax < RTAX_MAX; rtax++)
381 if (rtm->rtm_addrs & (1 << rtax)) {
382 sa[rtax] = (struct sockaddr *)wp;
383 wp += ROUNDUP(sa[rtax]->sa_len);
384 } else
385 sa[rtax] = NULL;
386}
387
369int
370route_Show(struct cmdargs const *arg)
371{
372 struct rt_msghdr *rtm;
388int
389route_Show(struct cmdargs const *arg)
390{
391 struct rt_msghdr *rtm;
373 struct sockaddr *sa_dst, *sa_gw, *sa_mask;
374 char *sp, *ep, *cp, *wp;
392 struct sockaddr *sa[RTAX_MAX];
393 char *sp, *ep, *cp;
375 size_t needed;
376 int mib[6];
377
378 mib[0] = CTL_NET;
379 mib[1] = PF_ROUTE;
380 mib[2] = 0;
381 mib[3] = 0;
382 mib[4] = NET_RT_DUMP;

--- 10 unchanged lines hidden (view full) ---

393 free(sp);
394 return (1);
395 }
396 ep = sp + needed;
397
398 prompt_Printf(arg->prompt, "%-20s%-20sFlags Netif\n",
399 "Destination", "Gateway");
400 for (cp = sp; cp < ep; cp += rtm->rtm_msglen) {
394 size_t needed;
395 int mib[6];
396
397 mib[0] = CTL_NET;
398 mib[1] = PF_ROUTE;
399 mib[2] = 0;
400 mib[3] = 0;
401 mib[4] = NET_RT_DUMP;

--- 10 unchanged lines hidden (view full) ---

412 free(sp);
413 return (1);
414 }
415 ep = sp + needed;
416
417 prompt_Printf(arg->prompt, "%-20s%-20sFlags Netif\n",
418 "Destination", "Gateway");
419 for (cp = sp; cp < ep; cp += rtm->rtm_msglen) {
401 rtm = (struct rt_msghdr *) cp;
402 wp = (char *)(rtm+1);
420 rtm = (struct rt_msghdr *)cp;
403
421
404 /*
405 * This code relies on RTA_DST, RTA_GATEWAY and RTA_NETMASK
406 * having values 1, 2 and 4 respectively (or at least relies
407 * on them being the first 3 possible sockaddrs in that order) !
408 */
422 route_ParseHdr(rtm, sa);
409
423
410 if (rtm->rtm_addrs & RTA_DST) {
411 sa_dst = (struct sockaddr *)wp;
412 wp += sa_dst->sa_len;
413 } else
414 sa_dst = NULL;
424 if (sa[RTAX_DST] && sa[RTAX_GATEWAY]) {
425 p_sockaddr(arg->prompt, sa[RTAX_DST], sa[RTAX_NETMASK], 20);
426 p_sockaddr(arg->prompt, sa[RTAX_GATEWAY], NULL, 20);
415
427
416 if (rtm->rtm_addrs & RTA_GATEWAY) {
417 sa_gw = (struct sockaddr *)wp;
418 wp += sa_gw->sa_len;
419 } else
420 sa_gw = NULL;
421
422 if (rtm->rtm_addrs & RTA_NETMASK) {
423 sa_mask = (struct sockaddr *)wp;
424 wp += sa_mask->sa_len;
425 } else
426 sa_mask = NULL;
427
428 if (sa_dst && sa_gw) {
429 p_sockaddr(arg->prompt, sa_dst, sa_mask, 20);
430 p_sockaddr(arg->prompt, sa_gw, NULL, 20);
431
432 p_flags(arg->prompt, rtm->rtm_flags, 6);
433 prompt_Printf(arg->prompt, " %s\n", Index2Nam(rtm->rtm_index));
434 } else
435 prompt_Printf(arg->prompt, "<can't parse routing entry>\n");
436 }
437 free(sp);
438 return 0;
439}
440
441/*
442 * Delete routes associated with our interface
443 */
444void
445route_IfDelete(struct bundle *bundle, int all)
446{
447 struct rt_msghdr *rtm;
428 p_flags(arg->prompt, rtm->rtm_flags, 6);
429 prompt_Printf(arg->prompt, " %s\n", Index2Nam(rtm->rtm_index));
430 } else
431 prompt_Printf(arg->prompt, "<can't parse routing entry>\n");
432 }
433 free(sp);
434 return 0;
435}
436
437/*
438 * Delete routes associated with our interface
439 */
440void
441route_IfDelete(struct bundle *bundle, int all)
442{
443 struct rt_msghdr *rtm;
448 struct sockaddr *sa;
449 struct in_addr sa_dst, sa_none;
444 struct sockaddr *sa[RTAX_MAX];
445 struct sockaddr_in **in;
446 struct in_addr sa_none;
450 int pass;
451 size_t needed;
452 char *sp, *cp, *ep;
453 int mib[6];
454
455 log_Printf(LogDEBUG, "route_IfDelete (%d)\n", bundle->iface->index);
456 sa_none.s_addr = INADDR_ANY;
447 int pass;
448 size_t needed;
449 char *sp, *cp, *ep;
450 int mib[6];
451
452 log_Printf(LogDEBUG, "route_IfDelete (%d)\n", bundle->iface->index);
453 sa_none.s_addr = INADDR_ANY;
454 in = (struct sockaddr_in **)sa;
457
458 mib[0] = CTL_NET;
459 mib[1] = PF_ROUTE;
460 mib[2] = 0;
461 mib[3] = 0;
462 mib[4] = NET_RT_DUMP;
463 mib[5] = 0;
464 if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) {

--- 12 unchanged lines hidden (view full) ---

477 free(sp);
478 return;
479 }
480 ep = sp + needed;
481
482 for (pass = 0; pass < 2; pass++) {
483 /*
484 * We do 2 passes. The first deletes all cloned routes. The second
455
456 mib[0] = CTL_NET;
457 mib[1] = PF_ROUTE;
458 mib[2] = 0;
459 mib[3] = 0;
460 mib[4] = NET_RT_DUMP;
461 mib[5] = 0;
462 if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) {

--- 12 unchanged lines hidden (view full) ---

475 free(sp);
476 return;
477 }
478 ep = sp + needed;
479
480 for (pass = 0; pass < 2; pass++) {
481 /*
482 * We do 2 passes. The first deletes all cloned routes. The second
485 * deletes all non-cloned routes. This is necessary to avoid
483 * deletes all non-cloned routes. This is done to avoid
486 * potential errors from trying to delete route X after route Y where
487 * route X was cloned from route Y (and is no longer there 'cos it
488 * may have gone with route Y).
489 */
490 if (RTF_WASCLONED == 0 && pass == 0)
491 /* So we can't tell ! */
492 continue;
493 for (cp = sp; cp < ep; cp += rtm->rtm_msglen) {
484 * potential errors from trying to delete route X after route Y where
485 * route X was cloned from route Y (and is no longer there 'cos it
486 * may have gone with route Y).
487 */
488 if (RTF_WASCLONED == 0 && pass == 0)
489 /* So we can't tell ! */
490 continue;
491 for (cp = sp; cp < ep; cp += rtm->rtm_msglen) {
494 rtm = (struct rt_msghdr *) cp;
495 sa = (struct sockaddr *) (rtm + 1);
496 log_Printf(LogDEBUG, "route_IfDelete: addrs: %x, Netif: %d (%s),"
497 " flags: %x, dst: %s ?\n", rtm->rtm_addrs, rtm->rtm_index,
498 Index2Nam(rtm->rtm_index), rtm->rtm_flags,
499 inet_ntoa(((struct sockaddr_in *) sa)->sin_addr));
500 if (rtm->rtm_addrs & RTA_DST && rtm->rtm_addrs & RTA_GATEWAY &&
501 rtm->rtm_index == bundle->iface->index &&
502 (all || (rtm->rtm_flags & RTF_GATEWAY))) {
503 sa_dst.s_addr = ((struct sockaddr_in *)sa)->sin_addr.s_addr;
504 sa = (struct sockaddr *)((char *)sa + sa->sa_len);
505 if (sa->sa_family == AF_INET || sa->sa_family == AF_LINK) {
506 if ((pass == 0 && (rtm->rtm_flags & RTF_WASCLONED)) ||
507 (pass == 1 && !(rtm->rtm_flags & RTF_WASCLONED))) {
508 log_Printf(LogDEBUG, "route_IfDelete: Remove it (pass %d)\n", pass);
509 bundle_SetRoute(bundle, RTM_DELETE, sa_dst, sa_none, sa_none, 0, 0);
492 rtm = (struct rt_msghdr *)cp;
493 route_ParseHdr(rtm, sa);
494 if (sa[RTAX_DST]) {
495 log_Printf(LogDEBUG, "route_IfDelete: addrs: %x, Netif: %d (%s),"
496 " flags: %x, dst: %s ?\n", rtm->rtm_addrs, rtm->rtm_index,
497 Index2Nam(rtm->rtm_index), rtm->rtm_flags,
498 inet_ntoa(((struct sockaddr_in *)sa[RTAX_DST])->sin_addr));
499 if (sa[RTAX_GATEWAY] && rtm->rtm_index == bundle->iface->index &&
500 (all || (rtm->rtm_flags & RTF_GATEWAY))) {
501 if (sa[RTAX_GATEWAY]->sa_family == AF_INET ||
502 sa[RTAX_GATEWAY]->sa_family == AF_LINK) {
503 if ((pass == 0 && (rtm->rtm_flags & RTF_WASCLONED)) ||
504 (pass == 1 && !(rtm->rtm_flags & RTF_WASCLONED))) {
505 log_Printf(LogDEBUG, "route_IfDelete: Remove it (pass %d)\n",
506 pass);
507 bundle_SetRoute(bundle, RTM_DELETE, in[RTAX_DST]->sin_addr,
508 sa_none, sa_none, 0, 0);
509 } else
510 log_Printf(LogDEBUG, "route_IfDelete: Skip it (pass %d)\n", pass);
510 } else
511 } else
511 log_Printf(LogDEBUG, "route_IfDelete: Skip it (pass %d)\n", pass);
512 } else
513 log_Printf(LogDEBUG,
514 "route_IfDelete: Can't remove routes of %d family !\n",
515 sa->sa_family);
512 log_Printf(LogDEBUG,
513 "route_IfDelete: Can't remove routes of %d family !\n",
514 sa[RTAX_GATEWAY]->sa_family);
515 }
516 }
517 }
518 }
519 free(sp);
520}
521
522int
523GetIfIndex(char *name)

--- 144 unchanged lines hidden ---
516 }
517 }
518 }
519 free(sp);
520}
521
522int
523GetIfIndex(char *name)

--- 144 unchanged lines hidden ---