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 --- |