Deleted Added
full compact
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 ---