Lines Matching +full:ftrace +full:- +full:size
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
42 u_int8_t icmp_ad_asize; /* 2--words in each advertisement */
65 int rdisc_sock = -1; /* router-discovery raw socket */
85 * and unsigned zero-based preferences */
90 #define PREF(p, ifp) ((int)(p) <= ((ifp)->int_metric+(ifp)->int_adj_outmetric)\
92 : (p) - ((ifp)->int_metric+(ifp)->int_adj_outmetric))
111 if (!TRACEPACKETS || ftrace == NULL) in trace_rdisc()
116 if (p->icmp.icmp_type == ICMP_ROUTERADVERT) { in trace_rdisc()
117 (void)fprintf(ftrace, "%s Router Ad" in trace_rdisc()
120 ifp ? ifp->int_name : "?", in trace_rdisc()
121 ntohs(p->ad.icmp_ad_life)); in trace_rdisc()
125 wp = &p->ad.icmp_ad_info[0].icmp_ad_addr; in trace_rdisc()
126 lim = &wp[(len - sizeof(p->ad)) / sizeof(*wp)]; in trace_rdisc()
127 for (i = 0; i < p->ad.icmp_ad_num && wp <= lim; i++) { in trace_rdisc()
128 (void)fprintf(ftrace, "\t%s preference=%d", in trace_rdisc()
130 wp += p->ad.icmp_ad_asize; in trace_rdisc()
132 (void)fputc('\n',ftrace); in trace_rdisc()
137 ifp ? ifp->int_name : "?", in trace_rdisc()
138 (int)ntohl(p->so.icmp_so_rsvd)); in trace_rdisc()
157 /* Pick multicast group for router-discovery socket
172 if ((ifp->int_state & IS_NO_RDISC) == IS_NO_RDISC in set_rdisc_mg()
178 if (!(ifp->int_if_flags & IFF_MULTICAST)) { in set_rdisc_mg()
179 ifp->int_state &= ~(IS_ALL_HOSTS | IS_ALL_ROUTERS); in set_rdisc_mg()
184 gr.gr_interface = ifp->int_index; in set_rdisc_mg()
186 sin->sin_family = AF_INET; in set_rdisc_mg()
188 sin->sin_len = sizeof(struct sockaddr_in); in set_rdisc_mg()
192 || (ifp->int_state & IS_NO_ADV_IN) in set_rdisc_mg()
196 if (ifp->int_state & IS_ALL_HOSTS) { in set_rdisc_mg()
197 sin->sin_addr.s_addr = htonl(INADDR_ALLHOSTS_GROUP); in set_rdisc_mg()
202 ifp->int_state &= ~IS_ALL_HOSTS; in set_rdisc_mg()
205 } else if (!(ifp->int_state & IS_ALL_HOSTS)) { in set_rdisc_mg()
208 sin->sin_addr.s_addr = htonl(INADDR_ALLHOSTS_GROUP); in set_rdisc_mg()
213 ifp->int_state |= IS_ALL_HOSTS; in set_rdisc_mg()
218 || (ifp->int_state & IS_NO_ADV_OUT) in set_rdisc_mg()
222 if (ifp->int_state & IS_ALL_ROUTERS) { in set_rdisc_mg()
223 sin->sin_addr.s_addr = htonl(INADDR_ALLROUTERS_GROUP); in set_rdisc_mg()
228 ifp->int_state &= ~IS_ALL_ROUTERS; in set_rdisc_mg()
231 } else if (!(ifp->int_state & IS_ALL_ROUTERS)) { in set_rdisc_mg()
234 sin->sin_addr.s_addr = htonl(INADDR_ALLROUTERS_GROUP); in set_rdisc_mg()
239 ifp->int_state |= IS_ALL_ROUTERS; in set_rdisc_mg()
261 drp->dr_recv_pref = 0; in set_supplier()
262 drp->dr_life = 0; in set_supplier()
276 if (ifp->int_state & IS_BROKE) in set_supplier()
278 ifp->int_rdisc_cnt = 0; in set_supplier()
279 ifp->int_rdisc_timer.tv_usec = rdisc_timer.tv_usec; in set_supplier()
280 ifp->int_rdisc_timer.tv_sec = now.tv_sec+MIN_WAITTIME; in set_supplier()
318 if (drp->dr_ts == 0) in rdisc_age()
326 if (drp->dr_gate == bad_gate) { in rdisc_age()
327 sec = (now.tv_sec - drp->dr_life in rdisc_age()
329 if (drp->dr_ts > sec) { in rdisc_age()
330 trace_act("age 0.0.0.0 --> %s via %s", in rdisc_age()
331 naddr_ntoa(drp->dr_gate), in rdisc_age()
332 drp->dr_ifp->int_name); in rdisc_age()
333 drp->dr_ts = sec; in rdisc_age()
355 * This should only be called when !(ifp->int_state & IS_ALIAS)
363 if (drp->dr_ifp != ifp) in if_bad_rdisc()
365 drp->dr_recv_pref = 0; in if_bad_rdisc()
366 drp->dr_ts = 0; in if_bad_rdisc()
367 drp->dr_life = 0; in if_bad_rdisc()
370 /* make a note to re-solicit, turn RIP on or off, etc. */ in if_bad_rdisc()
382 ifp->int_rdisc_cnt = 0; in if_ok_rdisc()
383 ifp->int_rdisc_timer.tv_sec = now.tv_sec + (supplier in if_ok_rdisc()
386 if (timercmp(&rdisc_timer, &ifp->int_rdisc_timer, >)) in if_ok_rdisc()
387 rdisc_timer = ifp->int_rdisc_timer; in if_ok_rdisc()
401 del_redirects(gate = drp->dr_gate, 0); in del_rdisc()
402 drp->dr_ts = 0; in del_rdisc()
403 drp->dr_life = 0; in del_rdisc()
409 ifp = drp->dr_ifp; in del_rdisc()
411 if (drp->dr_ts != 0 in del_rdisc()
412 && drp->dr_ifp == ifp) in del_rdisc()
422 " is bad--have %d remaining", in del_rdisc()
423 naddr_ntoa(gate), ifp->int_name, i); in del_rdisc()
424 } else if (ifp->int_rdisc_cnt >= MAX_SOLICITATIONS) { in del_rdisc()
426 " is bad--re-solicit", in del_rdisc()
427 naddr_ntoa(gate), ifp->int_name); in del_rdisc()
428 ifp->int_rdisc_cnt = 0; in del_rdisc()
429 ifp->int_rdisc_timer.tv_sec = 0; in del_rdisc()
433 " is bad--wait to solicit", in del_rdisc()
434 naddr_ntoa(gate), ifp->int_name); in del_rdisc()
457 if (drp->dr_ts == 0) in rdisc_sort()
459 ifp = drp->dr_ifp; in rdisc_sort()
463 if (drp->dr_ts + drp->dr_life <= now.tv_sec) { in rdisc_sort()
468 LIM_SEC(rdisc_timer, drp->dr_ts+drp->dr_life+1); in rdisc_sort()
473 drp->dr_pref = PREF(drp->dr_recv_pref, ifp); in rdisc_sort()
481 || (!((new_st ^ drp->dr_ifp->int_state) & IS_SICK) in rdisc_sort()
482 && (new_pref < drp->dr_pref in rdisc_sort()
483 || (new_pref == drp->dr_pref in rdisc_sort()
486 && new_drp->dr_life > drp->dr_life))))) in rdisc_sort()
488 && !(drp->dr_ifp->int_state & IS_SICK))) { in rdisc_sort()
490 new_st = drp->dr_ifp->int_state; in rdisc_sort()
491 new_pref = drp->dr_pref; in rdisc_sort()
507 && (rt->rt_state & RS_RDISC)) { in rdisc_sort()
508 new = rt->rt_spares[0]; in rdisc_sort()
510 new.rts_time = now.tv_sec - GARBAGE_TIME; in rdisc_sort()
511 rtchange(rt, rt->rt_state & ~RS_RDISC, in rdisc_sort()
520 naddr_ntoa(new_drp->dr_gate), in rdisc_sort()
521 new_drp->dr_ifp->int_name); in rdisc_sort()
527 naddr_ntoa(cur_drp->dr_gate), in rdisc_sort()
528 cur_drp->dr_ifp->int_name, in rdisc_sort()
529 naddr_ntoa(new_drp->dr_gate), in rdisc_sort()
530 new_drp->dr_ifp->int_name); in rdisc_sort()
534 new.rts_ifp = new_drp->dr_ifp; in rdisc_sort()
535 new.rts_gate = new_drp->dr_gate; in rdisc_sort()
536 new.rts_router = new_drp->dr_gate; in rdisc_sort()
537 new.rts_metric = HOPCNT_INFINITY-1; in rdisc_sort()
540 rtchange(rt, rt->rt_state | RS_RDISC, &new, 0); in rdisc_sort()
585 if (!on_net(gate, ifp->int_net, ifp->int_mask)) { in parse_ad()
604 if (drp->dr_gate == gate) { in parse_ad()
612 if (drp->dr_ts == 0) { in parse_ad()
619 if ((!(ifp->int_state & IS_SICK) in parse_ad()
620 && (drp->dr_ifp->int_state & IS_SICK)) in parse_ad()
621 || (pref > drp->dr_pref in parse_ad()
622 && !((ifp->int_state ^ drp->dr_ifp->int_state) in parse_ad()
626 } else if (new_drp->dr_ts != 0) { in parse_ad()
629 if ((!(new_drp->dr_ifp->int_state & IS_SICK) in parse_ad()
630 && (drp->dr_ifp->int_state & IS_SICK)) in parse_ad()
631 || (new_drp->dr_pref > drp->dr_pref in parse_ad()
632 && !((new_drp->dr_ifp->int_state in parse_ad()
633 ^ drp->dr_ifp->int_state) in parse_ad()
643 new_drp->dr_ifp = ifp; in parse_ad()
644 new_drp->dr_gate = gate; in parse_ad()
645 new_drp->dr_ts = now.tv_sec; in parse_ad()
646 new_drp->dr_life = life; in parse_ad()
647 new_drp->dr_recv_pref = pref; in parse_ad()
649 new_drp->dr_pref = PREF(pref,ifp); in parse_ad()
653 if (!(ifp->int_state & IS_SICK)) in parse_ad()
654 ifp->int_rdisc_cnt = MAX_SOLICITATIONS; in parse_ad()
668 while (nwords-- != 0) in in_cksum()
674 /* end-around-carry */ in in_cksum()
710 if (ifp->int_if_flags & IFF_POINTOPOINT) { in send_rdisc()
711 msg = "Send pt-to-pt"; in send_rdisc()
712 rsin.sin_addr.s_addr = ifp->int_dstaddr; in send_rdisc()
715 rsin.sin_addr.s_addr = ifp->int_brdaddr; in send_rdisc()
721 if (ifp->int_state & IS_DUP) { in send_rdisc()
724 ifp->int_name); in send_rdisc()
732 mreqn.imr_ifindex = ifp->int_index; in send_rdisc()
751 trace_rdisc(msg, (ifp ? ifp->int_addr : 0), rsin.sin_addr.s_addr, ifp, in send_rdisc()
756 if (ifp == NULL || !(ifp->int_state & IS_BROKE)) in send_rdisc()
758 ifp != NULL ? ifp->int_name : "", in send_rdisc()
785 u.ad.icmp_ad_life = stopint ? 0 : htons(ifp->int_rdisc_int*3); in send_adv()
791 pref = UNSIGN_PREF(ifp->int_rdisc_pref); in send_adv()
794 u.ad.icmp_ad_info[0].icmp_ad_addr = ifp->int_addr; in send_adv()
815 if (0 != (ifp->int_state & (IS_NO_ADV_OUT | IS_BROKE))) in rdisc_adv()
818 if (!timercmp(&ifp->int_rdisc_timer, &now, >) in rdisc_adv()
821 (ifp->int_state&IS_BCAST_RDISC) ? 1 : 2); in rdisc_adv()
822 ifp->int_rdisc_cnt++; in rdisc_adv()
824 intvl_random(&ifp->int_rdisc_timer, in rdisc_adv()
825 (ifp->int_rdisc_int*3)/4, in rdisc_adv()
826 ifp->int_rdisc_int); in rdisc_adv()
827 if (ifp->int_rdisc_cnt < MAX_INITIAL_ADVERTS in rdisc_adv()
828 && (ifp->int_rdisc_timer.tv_sec in rdisc_adv()
830 ifp->int_rdisc_timer.tv_sec in rdisc_adv()
833 timevaladd(&ifp->int_rdisc_timer, &now); in rdisc_adv()
836 if (timercmp(&rdisc_timer, &ifp->int_rdisc_timer, >)) in rdisc_adv()
837 rdisc_timer = ifp->int_rdisc_timer; in rdisc_adv()
857 if (0 != (ifp->int_state & (IS_NO_SOL_OUT | IS_BROKE)) in rdisc_sol()
858 || ifp->int_rdisc_cnt >= MAX_SOLICITATIONS) in rdisc_sol()
861 if (!timercmp(&ifp->int_rdisc_timer, &now, >)) { in rdisc_sol()
868 ((ifp->int_state&IS_BCAST_RDISC) ? 1 : 2)); in rdisc_sol()
870 if (++ifp->int_rdisc_cnt >= MAX_SOLICITATIONS) in rdisc_sol()
873 ifp->int_rdisc_timer.tv_sec = SOLICITATION_INTERVAL; in rdisc_sol()
874 ifp->int_rdisc_timer.tv_usec = 0; in rdisc_sol()
875 timevaladd(&ifp->int_rdisc_timer, &now); in rdisc_sol()
878 if (timercmp(&rdisc_timer, &ifp->int_rdisc_timer, >)) in rdisc_sol()
879 rdisc_timer = ifp->int_rdisc_timer; in rdisc_sol()
896 if (p->icmp.icmp_type == ICMP_ROUTERADVERT) { in ck_icmp()
898 } else if (p->icmp.icmp_type == ICMP_ROUTERSOLICIT) { in ck_icmp()
904 if (p->icmp.icmp_code != 0) { in ck_icmp()
906 type, p->icmp.icmp_code, in ck_icmp()
914 trace_pkt("unknown interface for router-discovery %s" in ck_icmp()
961 if ((cc -= sizeof(buf.ifname)) < 0) in read_d()
970 cc -= hlen; in read_d()
995 switch (p->icmp.icmp_type) { in read_d()
997 if (p->ad.icmp_ad_asize*4 in read_d()
998 < (int)sizeof(p->ad.icmp_ad_info[0])) { in read_d()
1000 "intolerable rdisc address size=%d", in read_d()
1001 p->ad.icmp_ad_asize); in read_d()
1004 if (p->ad.icmp_ad_num == 0) { in read_d()
1008 if (cc != (int)(sizeof(p->ad) in read_d()
1009 - sizeof(p->ad.icmp_ad_info) in read_d()
1010 + (p->ad.icmp_ad_num in read_d()
1011 * sizeof(p->ad.icmp_ad_info[0])))) { in read_d()
1014 " %d", cc, p->ad.icmp_ad_num); in read_d()
1019 if (ifp->int_state & IS_NO_ADV_IN) in read_d()
1022 wp = &p->ad.icmp_ad_info[0].icmp_ad_addr; in read_d()
1023 for (n = 0; n < p->ad.icmp_ad_num; n++) { in read_d()
1026 ntohs(p->ad.icmp_ad_life), in read_d()
1028 wp += p->ad.icmp_ad_asize; in read_d()
1036 if (ifp->int_state & IS_NO_ADV_OUT) in read_d()
1045 /* Respond with a point-to-point advertisement */ in read_d()