table.c (108533) | table.c (126250) |
---|---|
1/* 2 * Copyright (c) 1983, 1988, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 16 unchanged lines hidden (view full) --- 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * | 1/* 2 * Copyright (c) 1983, 1988, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 16 unchanged lines hidden (view full) --- 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * |
33 * $FreeBSD: head/sbin/routed/table.c 108533 2003-01-01 18:49:04Z schweikh $ | 33 * $FreeBSD: head/sbin/routed/table.c 126250 2004-02-25 23:45:57Z bms $ |
34 */ 35 36#include "defs.h" 37 | 34 */ 35 36#include "defs.h" 37 |
38#if !defined(sgi) && !defined(__NetBSD__) 39static char sccsid[] __attribute__((unused)) = "@(#)tables.c 8.1 (Berkeley) 6/5/93"; 40#elif defined(__NetBSD__) | 38#ifdef __NetBSD__ |
41__RCSID("$NetBSD$"); | 39__RCSID("$NetBSD$"); |
40#elif defined(__FreeBSD__) 41__RCSID("$FreeBSD: head/sbin/routed/table.c 126250 2004-02-25 23:45:57Z bms $"); 42#else 43__RCSID("$Revision: 2.27 $"); 44#ident "$Revision: 2.27 $" |
|
42#endif | 45#endif |
43#ident "$FreeBSD: head/sbin/routed/table.c 108533 2003-01-01 18:49:04Z schweikh $" | 46#ident "$FreeBSD: head/sbin/routed/table.c 126250 2004-02-25 23:45:57Z bms $" |
44 45static struct rt_spare *rts_better(struct rt_entry *); 46static struct rt_spare rts_empty = {0,0,0,HOPCNT_INFINITY,0,0,0}; 47static void set_need_flash(void); 48#ifdef _HAVE_SIN_LEN 49static void masktrim(struct sockaddr_in *ap); 50#else 51static void masktrim(struct sockaddr_in_new *ap); --- 196 unchanged lines hidden (view full) --- 248 } 249 250 /* If the coarse route has a good enough 251 * metric, it suppresses the target. 252 * If the suppressed target was redundant, 253 * then mark the suppressor redundant. 254 */ 255 if (ag_cors->ag_pref <= ag->ag_pref) { | 47 48static struct rt_spare *rts_better(struct rt_entry *); 49static struct rt_spare rts_empty = {0,0,0,HOPCNT_INFINITY,0,0,0}; 50static void set_need_flash(void); 51#ifdef _HAVE_SIN_LEN 52static void masktrim(struct sockaddr_in *ap); 53#else 54static void masktrim(struct sockaddr_in_new *ap); --- 196 unchanged lines hidden (view full) --- 251 } 252 253 /* If the coarse route has a good enough 254 * metric, it suppresses the target. 255 * If the suppressed target was redundant, 256 * then mark the suppressor redundant. 257 */ 258 if (ag_cors->ag_pref <= ag->ag_pref) { |
256 if (ag_cors->ag_seqno > ag->ag_seqno) 257 ag_cors->ag_seqno = ag->ag_seqno; | |
258 if (AG_IS_REDUN(ag->ag_state) 259 && ag_cors->ag_mask==ag->ag_mask<<1) { 260 if (ag_cors->ag_dst_h == dst_h) 261 ag_cors->ag_state |= AGS_REDUN0; 262 else 263 ag_cors->ag_state |= AGS_REDUN1; 264 } 265 if (ag->ag_tag != ag_cors->ag_tag) --- 18 unchanged lines hidden (view full) --- 284 */ 285void 286ag_check(naddr dst, 287 naddr mask, 288 naddr gate, 289 naddr nhop, 290 char metric, 291 char pref, | 259 if (AG_IS_REDUN(ag->ag_state) 260 && ag_cors->ag_mask==ag->ag_mask<<1) { 261 if (ag_cors->ag_dst_h == dst_h) 262 ag_cors->ag_state |= AGS_REDUN0; 263 else 264 ag_cors->ag_state |= AGS_REDUN1; 265 } 266 if (ag->ag_tag != ag_cors->ag_tag) --- 18 unchanged lines hidden (view full) --- 285 */ 286void 287ag_check(naddr dst, 288 naddr mask, 289 naddr gate, 290 naddr nhop, 291 char metric, 292 char pref, |
292 u_int seqno, | 293 u_int new_seqno, |
293 u_short tag, 294 u_short state, 295 void (*out)(struct ag_info *)) /* output using this */ 296{ 297 struct ag_info *ag, *nag, *ag_cors; 298 naddr xaddr; 299 int x; 300 --- 10 unchanged lines hidden (view full) --- 311 nc_ag.ag_dst_h = dst; 312 nc_ag.ag_mask = mask; 313 nc_ag.ag_gate = gate; 314 nc_ag.ag_nhop = nhop; 315 nc_ag.ag_metric = metric; 316 nc_ag.ag_pref = pref; 317 nc_ag.ag_tag = tag; 318 nc_ag.ag_state = state; | 294 u_short tag, 295 u_short state, 296 void (*out)(struct ag_info *)) /* output using this */ 297{ 298 struct ag_info *ag, *nag, *ag_cors; 299 naddr xaddr; 300 int x; 301 --- 10 unchanged lines hidden (view full) --- 312 nc_ag.ag_dst_h = dst; 313 nc_ag.ag_mask = mask; 314 nc_ag.ag_gate = gate; 315 nc_ag.ag_nhop = nhop; 316 nc_ag.ag_metric = metric; 317 nc_ag.ag_pref = pref; 318 nc_ag.ag_tag = tag; 319 nc_ag.ag_state = state; |
319 nc_ag.ag_seqno = seqno; | 320 nc_ag.ag_seqno = new_seqno; |
320 out(&nc_ag); 321 return; 322 } 323 324 /* Search for the right slot in the aggregation table. 325 */ 326 ag_cors = 0; 327 ag = ag_corsest; --- 13 unchanged lines hidden (view full) --- 341 if (ag_cors != 0 342 && ag->ag_dst_h < dst 343 && (ag->ag_state & AGS_SUPPRESS) 344 && ag_cors->ag_pref <= ag->ag_pref 345 && (ag->ag_dst_h & ag_cors->ag_mask) == ag_cors->ag_dst_h 346 && (ag_cors->ag_gate == ag->ag_gate 347 || (ag->ag_state & AGS_FINE_GATE) 348 || (ag_cors->ag_state & AGS_CORS_GATE))) { | 321 out(&nc_ag); 322 return; 323 } 324 325 /* Search for the right slot in the aggregation table. 326 */ 327 ag_cors = 0; 328 ag = ag_corsest; --- 13 unchanged lines hidden (view full) --- 342 if (ag_cors != 0 343 && ag->ag_dst_h < dst 344 && (ag->ag_state & AGS_SUPPRESS) 345 && ag_cors->ag_pref <= ag->ag_pref 346 && (ag->ag_dst_h & ag_cors->ag_mask) == ag_cors->ag_dst_h 347 && (ag_cors->ag_gate == ag->ag_gate 348 || (ag->ag_state & AGS_FINE_GATE) 349 || (ag_cors->ag_state & AGS_CORS_GATE))) { |
349 if (ag_cors->ag_seqno > ag->ag_seqno) 350 ag_cors->ag_seqno = ag->ag_seqno; | |
351 /* If the suppressed target was redundant, 352 * then mark the suppressor redundant. 353 */ 354 if (AG_IS_REDUN(ag->ag_state) 355 && ag_cors->ag_mask == ag->ag_mask<<1) { 356 if (ag_cors->ag_dst_h == dst) 357 ag_cors->ag_state |= AGS_REDUN0; 358 else --- 42 unchanged lines hidden (view full) --- 401 * of longest-match rule. 402 */ 403 if (pref <= ag->ag_pref) { 404 ag->ag_gate = gate; 405 ag->ag_nhop = nhop; 406 ag->ag_tag = tag; 407 ag->ag_metric = metric; 408 ag->ag_pref = pref; | 350 /* If the suppressed target was redundant, 351 * then mark the suppressor redundant. 352 */ 353 if (AG_IS_REDUN(ag->ag_state) 354 && ag_cors->ag_mask == ag->ag_mask<<1) { 355 if (ag_cors->ag_dst_h == dst) 356 ag_cors->ag_state |= AGS_REDUN0; 357 else --- 42 unchanged lines hidden (view full) --- 400 * of longest-match rule. 401 */ 402 if (pref <= ag->ag_pref) { 403 ag->ag_gate = gate; 404 ag->ag_nhop = nhop; 405 ag->ag_tag = tag; 406 ag->ag_metric = metric; 407 ag->ag_pref = pref; |
408 if (ag->ag_seqno < new_seqno) 409 ag->ag_seqno = new_seqno; |
|
409 x = ag->ag_state; 410 ag->ag_state = state; 411 state = x; 412 } 413 | 410 x = ag->ag_state; 411 ag->ag_state = state; 412 state = x; 413 } 414 |
414 /* The sequence number controls flash updating, 415 * and should be the smaller of the two. 416 */ 417 if (ag->ag_seqno > seqno) 418 ag->ag_seqno = seqno; 419 | |
420 /* Some bits are set if they are set on either route, 421 * except when the route is for an interface. 422 */ 423 if (!(ag->ag_state & AGS_IF)) 424 ag->ag_state |= (state & (AGS_AGGREGATE_EITHER 425 | AGS_REDUN0 426 | AGS_REDUN1)); 427 return; --- 23 unchanged lines hidden (view full) --- 451 && (state & ag->ag_state & AGS_AGGREGATE) != 0)) { 452 453 /* We have both the even and odd pairs. 454 * Since the routes are encountered in order, 455 * the route in the slot must be the even twin. 456 * 457 * Combine and promote (aggregate) the pair of routes. 458 */ | 415 /* Some bits are set if they are set on either route, 416 * except when the route is for an interface. 417 */ 418 if (!(ag->ag_state & AGS_IF)) 419 ag->ag_state |= (state & (AGS_AGGREGATE_EITHER 420 | AGS_REDUN0 421 | AGS_REDUN1)); 422 return; --- 23 unchanged lines hidden (view full) --- 446 && (state & ag->ag_state & AGS_AGGREGATE) != 0)) { 447 448 /* We have both the even and odd pairs. 449 * Since the routes are encountered in order, 450 * the route in the slot must be the even twin. 451 * 452 * Combine and promote (aggregate) the pair of routes. 453 */ |
459 if (seqno > ag->ag_seqno) 460 seqno = ag->ag_seqno; | 454 if (new_seqno < ag->ag_seqno) 455 new_seqno = ag->ag_seqno; |
461 if (!AG_IS_REDUN(state)) 462 state &= ~AGS_REDUN1; 463 if (AG_IS_REDUN(ag->ag_state)) 464 state |= AGS_REDUN0; 465 else 466 state &= ~AGS_REDUN0; 467 state |= (ag->ag_state & AGS_AGGREGATE_EITHER); 468 if (ag->ag_tag != tag) --- 44 unchanged lines hidden (view full) --- 513 ag->ag_metric = metric; 514 metric = x; 515 516 x = ag->ag_pref; 517 ag->ag_pref = pref; 518 pref = x; 519 520 /* take the newest sequence number */ | 456 if (!AG_IS_REDUN(state)) 457 state &= ~AGS_REDUN1; 458 if (AG_IS_REDUN(ag->ag_state)) 459 state |= AGS_REDUN0; 460 else 461 state &= ~AGS_REDUN0; 462 state |= (ag->ag_state & AGS_AGGREGATE_EITHER); 463 if (ag->ag_tag != tag) --- 44 unchanged lines hidden (view full) --- 508 ag->ag_metric = metric; 509 metric = x; 510 511 x = ag->ag_pref; 512 ag->ag_pref = pref; 513 pref = x; 514 515 /* take the newest sequence number */ |
521 if (seqno >= ag->ag_seqno) 522 seqno = ag->ag_seqno; | 516 if (new_seqno <= ag->ag_seqno) 517 new_seqno = ag->ag_seqno; |
523 else | 518 else |
524 ag->ag_seqno = seqno; | 519 ag->ag_seqno = new_seqno; |
525 526 } else { 527 if (!(state & AGS_AGGREGATE)) 528 break; /* cannot promote either twin */ 529 530 /* Promote the new, odd twin by shaving its 531 * mask and address. 532 * The promoted route is odd-redundant only if the 533 * odd twin was fully redundant. It is not 534 * even-redundant because the even twin is still in 535 * the table. 536 */ 537 if (!AG_IS_REDUN(state)) 538 state &= ~AGS_REDUN1; 539 state &= ~AGS_REDUN0; | 520 521 } else { 522 if (!(state & AGS_AGGREGATE)) 523 break; /* cannot promote either twin */ 524 525 /* Promote the new, odd twin by shaving its 526 * mask and address. 527 * The promoted route is odd-redundant only if the 528 * odd twin was fully redundant. It is not 529 * even-redundant because the even twin is still in 530 * the table. 531 */ 532 if (!AG_IS_REDUN(state)) 533 state &= ~AGS_REDUN1; 534 state &= ~AGS_REDUN0; |
540 if (seqno > ag->ag_seqno) 541 seqno = ag->ag_seqno; | 535 if (new_seqno < ag->ag_seqno) 536 new_seqno = ag->ag_seqno; |
542 else | 537 else |
543 ag->ag_seqno = seqno; | 538 ag->ag_seqno = new_seqno; |
544 } 545 546 mask <<= 1; 547 dst &= mask; 548 549 if (ag_cors == 0) { 550 ag = ag_corsest; 551 break; --- 44 unchanged lines hidden (view full) --- 596 nag->ag_dst_h = dst; 597 nag->ag_mask = mask; 598 nag->ag_gate = gate; 599 nag->ag_nhop = nhop; 600 nag->ag_metric = metric; 601 nag->ag_pref = pref; 602 nag->ag_tag = tag; 603 nag->ag_state = state; | 539 } 540 541 mask <<= 1; 542 dst &= mask; 543 544 if (ag_cors == 0) { 545 ag = ag_corsest; 546 break; --- 44 unchanged lines hidden (view full) --- 591 nag->ag_dst_h = dst; 592 nag->ag_mask = mask; 593 nag->ag_gate = gate; 594 nag->ag_nhop = nhop; 595 nag->ag_metric = metric; 596 nag->ag_pref = pref; 597 nag->ag_tag = tag; 598 nag->ag_state = state; |
604 nag->ag_seqno = seqno; | 599 nag->ag_seqno = new_seqno; |
605 606 nag->ag_fine = ag; 607 if (ag != 0) 608 ag->ag_cors = nag; 609 else 610 ag_finest = nag; 611 nag->ag_cors = ag_cors; 612 if (ag_cors == 0) --- 17 unchanged lines hidden (view full) --- 630 "RTM_REDIRECT", 631 "RTM_MISS", 632 "RTM_LOCK", 633 "RTM_OLDADD", 634 "RTM_OLDDEL", 635 "RTM_RESOLVE", 636 "RTM_NEWADDR", 637 "RTM_DELADDR", | 600 601 nag->ag_fine = ag; 602 if (ag != 0) 603 ag->ag_cors = nag; 604 else 605 ag_finest = nag; 606 nag->ag_cors = ag_cors; 607 if (ag_cors == 0) --- 17 unchanged lines hidden (view full) --- 625 "RTM_REDIRECT", 626 "RTM_MISS", 627 "RTM_LOCK", 628 "RTM_OLDADD", 629 "RTM_OLDDEL", 630 "RTM_RESOLVE", 631 "RTM_NEWADDR", 632 "RTM_DELADDR", |
633#ifdef RTM_OIFINFO 634 "RTM_OIFINFO", 635#endif |
|
638 "RTM_IFINFO", 639 "RTM_NEWMADDR", 640 "RTM_DELMADDR" 641 }; 642#define NEW_RTM_PAT "RTM type %#x" 643 static char name0[sizeof(NEW_RTM_PAT)+2]; 644 645 --- 363 unchanged lines hidden (view full) --- 1009 1010 1011/* Make the gateway slot of an info structure point to something 1012 * useful. If it is not already useful, but it specifies an interface, 1013 * then fill in the sockaddr_in provided and point it there. 1014 */ 1015static int 1016get_info_gate(struct sockaddr **sap, | 636 "RTM_IFINFO", 637 "RTM_NEWMADDR", 638 "RTM_DELMADDR" 639 }; 640#define NEW_RTM_PAT "RTM type %#x" 641 static char name0[sizeof(NEW_RTM_PAT)+2]; 642 643 --- 363 unchanged lines hidden (view full) --- 1007 1008 1009/* Make the gateway slot of an info structure point to something 1010 * useful. If it is not already useful, but it specifies an interface, 1011 * then fill in the sockaddr_in provided and point it there. 1012 */ 1013static int 1014get_info_gate(struct sockaddr **sap, |
1017 struct sockaddr_in *sin) | 1015 struct sockaddr_in *rsin) |
1018{ 1019 struct sockaddr_dl *sdl = (struct sockaddr_dl *)*sap; 1020 struct interface *ifp; 1021 1022 if (sdl == 0) 1023 return 0; 1024 if ((sdl)->sdl_family == AF_INET) 1025 return 1; 1026 if ((sdl)->sdl_family != AF_LINK) 1027 return 0; 1028 1029 ifp = ifwithindex(sdl->sdl_index, 1); 1030 if (ifp == 0) 1031 return 0; 1032 | 1016{ 1017 struct sockaddr_dl *sdl = (struct sockaddr_dl *)*sap; 1018 struct interface *ifp; 1019 1020 if (sdl == 0) 1021 return 0; 1022 if ((sdl)->sdl_family == AF_INET) 1023 return 1; 1024 if ((sdl)->sdl_family != AF_LINK) 1025 return 0; 1026 1027 ifp = ifwithindex(sdl->sdl_index, 1); 1028 if (ifp == 0) 1029 return 0; 1030 |
1033 sin->sin_addr.s_addr = ifp->int_addr; | 1031 rsin->sin_addr.s_addr = ifp->int_addr; |
1034#ifdef _HAVE_SA_LEN | 1032#ifdef _HAVE_SA_LEN |
1035 sin->sin_len = sizeof(*sin); | 1033 rsin->sin_len = sizeof(*rsin); |
1036#endif | 1034#endif |
1037 sin->sin_family = AF_INET; 1038 *sap = (struct sockaddr*)sin; | 1035 rsin->sin_family = AF_INET; 1036 *sap = (struct sockaddr*)rsin; |
1039 1040 return 1; 1041} 1042 1043 1044/* Clean the kernel table by copying it to the daemon image. 1045 * Eventually the daemon will delete any extra routes. 1046 */ --- 64 unchanged lines hidden (view full) --- 1111 continue; 1112 1113 /* ignore ARP table entries on systems with a merged route 1114 * and ARP table. 1115 */ 1116 if (rtm->rtm_flags & RTF_LLINFO) 1117 continue; 1118 | 1037 1038 return 1; 1039} 1040 1041 1042/* Clean the kernel table by copying it to the daemon image. 1043 * Eventually the daemon will delete any extra routes. 1044 */ --- 64 unchanged lines hidden (view full) --- 1109 continue; 1110 1111 /* ignore ARP table entries on systems with a merged route 1112 * and ARP table. 1113 */ 1114 if (rtm->rtm_flags & RTF_LLINFO) 1115 continue; 1116 |
1117#if defined(RTF_CLONED) && defined(__bsdi__) 1118 /* ignore cloned routes 1119 */ 1120 if (rtm->rtm_flags & RTF_CLONED) 1121 continue; 1122#endif 1123 |
|
1119 /* ignore multicast addresses 1120 */ 1121 if (IN_MULTICAST(ntohl(S_ADDR(INFO_DST(&info))))) 1122 continue; 1123 1124 if (!get_info_gate(&INFO_GATE(&info), &gate_sin)) 1125 continue; 1126 --- 91 unchanged lines hidden (view full) --- 1218 */ 1219 if (ifinit_timer.tv_sec-now.tv_sec>=CHECK_BAD_INTERVAL 1220 || ifp == 0 1221 || ((ifp->int_if_flags ^ m.ifm.ifm_flags) 1222 & IFF_UP) != 0) 1223 ifinit_timer.tv_sec = now.tv_sec; 1224 continue; 1225 } | 1124 /* ignore multicast addresses 1125 */ 1126 if (IN_MULTICAST(ntohl(S_ADDR(INFO_DST(&info))))) 1127 continue; 1128 1129 if (!get_info_gate(&INFO_GATE(&info), &gate_sin)) 1130 continue; 1131 --- 91 unchanged lines hidden (view full) --- 1223 */ 1224 if (ifinit_timer.tv_sec-now.tv_sec>=CHECK_BAD_INTERVAL 1225 || ifp == 0 1226 || ((ifp->int_if_flags ^ m.ifm.ifm_flags) 1227 & IFF_UP) != 0) 1228 ifinit_timer.tv_sec = now.tv_sec; 1229 continue; 1230 } |
1231#ifdef RTM_OIFINFO 1232 if (m.r.rtm.rtm_type == RTM_OIFINFO) 1233 continue; /* ignore compat message */ 1234#endif |
|
1226 1227 strcpy(str, rtm_type_name(m.r.rtm.rtm_type)); 1228 strp = &str[strlen(str)]; 1229 if (m.r.rtm.rtm_type <= RTM_CHANGE) 1230 strp += sprintf(strp," from pid %d",m.r.rtm.rtm_pid); 1231 1232 rt_xaddrs(&info, m.r.addrs, &m.r.addrs[RTAX_MAX], 1233 m.r.rtm.rtm_addrs); --- 23 unchanged lines hidden (view full) --- 1257 continue; 1258 } 1259 1260 if (m.r.rtm.rtm_flags & RTF_LLINFO) { 1261 trace_act("ignore ARP %s", str); 1262 continue; 1263 } 1264 | 1235 1236 strcpy(str, rtm_type_name(m.r.rtm.rtm_type)); 1237 strp = &str[strlen(str)]; 1238 if (m.r.rtm.rtm_type <= RTM_CHANGE) 1239 strp += sprintf(strp," from pid %d",m.r.rtm.rtm_pid); 1240 1241 rt_xaddrs(&info, m.r.addrs, &m.r.addrs[RTAX_MAX], 1242 m.r.rtm.rtm_addrs); --- 23 unchanged lines hidden (view full) --- 1266 continue; 1267 } 1268 1269 if (m.r.rtm.rtm_flags & RTF_LLINFO) { 1270 trace_act("ignore ARP %s", str); 1271 continue; 1272 } 1273 |
1274#if defined(RTF_CLONED) && defined(__bsdi__) 1275 if (m.r.rtm.rtm_flags & RTF_CLONED) { 1276 trace_act("ignore cloned %s", str); 1277 continue; 1278 } 1279#endif 1280 |
|
1265 if (get_info_gate(&INFO_GATE(&info), &gate_sin)) { 1266 gate = S_ADDR(INFO_GATE(&info)); 1267 strp += sprintf(strp, " --> %s", naddr_ntoa(gate)); 1268 } else { 1269 gate = 0; 1270 } 1271 1272 if (INFO_AUTHOR(&info) != 0) --- 870 unchanged lines hidden --- | 1281 if (get_info_gate(&INFO_GATE(&info), &gate_sin)) { 1282 gate = S_ADDR(INFO_GATE(&info)); 1283 strp += sprintf(strp, " --> %s", naddr_ntoa(gate)); 1284 } else { 1285 gate = 0; 1286 } 1287 1288 if (INFO_AUTHOR(&info) != 0) --- 870 unchanged lines hidden --- |