Lines Matching refs:pi

32 static void	advertise(struct sockaddr_in6 *sin6, struct phyint *pi,
34 static void solicit(struct sockaddr_in6 *sin6, struct phyint *pi);
36 static void check_if_removed(struct phyint *pi);
37 static void loopback_ra_enqueue(struct phyint *pi,
154 add_opt_lla(struct phyint *pi, struct nd_opt_lla *optp)
161 if (phyint_get_lla(pi, &lifr) == -1)
177 solicit(struct sockaddr_in6 *sin6, struct phyint *pi)
192 packetlen += add_opt_lla(pi, (struct nd_opt_lla *)pptr);
195 print_route_sol("Sending solicitation to ", pi, rs, packetlen,
198 sendpacket(sin6, pi->pi_sock, packetlen, 0);
208 advertise(struct sockaddr_in6 *sin6, struct phyint *pi, boolean_t no_prefixes)
220 ra->nd_ra_curhoplimit = pi->pi_AdvCurHopLimit;
222 if (pi->pi_AdvManagedFlag)
224 if (pi->pi_AdvOtherConfigFlag)
227 if (pi->pi_adv_state == FINAL_ADV)
230 ra->nd_ra_router_lifetime = htons(pi->pi_AdvDefaultLifetime);
231 ra->nd_ra_reachable = htonl(pi->pi_AdvReachableTime);
232 ra->nd_ra_retransmit = htonl(pi->pi_AdvRetransTimer);
237 if (pi->pi_adv_state == FINAL_ADV) {
239 print_route_adv("Sending advert (FINAL) to ", pi,
242 sendpacket(sin6, pi->pi_sock, packetlen, 0);
244 loopback_ra_enqueue(pi, ra, packetlen);
249 packetlen += add_opt_lla(pi, (struct nd_opt_lla *)pptr);
252 if (pi->pi_AdvLinkMTU != 0) {
258 mo->nd_opt_mtu_mtu = htonl(pi->pi_AdvLinkMTU);
266 print_route_adv("Sending advert to ", pi,
269 sendpacket(sin6, pi->pi_sock, packetlen, 0);
271 loopback_ra_enqueue(pi, ra, packetlen);
276 for (adv_pr = pi->pi_adv_prefix_list; adv_pr != NULL;
288 pi->pi_LinkMTU - sizeof (struct ip6_hdr)) {
292 pi, ra, packetlen, sin6);
294 sendpacket(sin6, pi->pi_sock, packetlen, 0);
296 loopback_ra_enqueue(pi, ra, packetlen);
339 print_route_adv("Sending advert to ", pi,
342 sendpacket(sin6, pi->pi_sock, packetlen, 0);
344 loopback_ra_enqueue(pi, ra, packetlen);
424 struct phyint *pi;
464 pi = phyint_lookup(phyintname);
465 if (pi == NULL) {
466 pi = phyint_create(phyintname);
467 if (pi == NULL) {
476 if (phyint_check_ipadm_intfid(pi) == -1)
485 (void) phyint_init_from_k(pi);
487 if (pi->pi_sock == -1 && !(pi->pi_kernel_state & PI_PRESENT)) {
491 "present %s\n", pi->pi_name);
496 if (pi->pi_sock != -1) {
497 if (poll_add(pi->pi_sock) == -1) {
501 phyint_cleanup(pi);
513 pi->pi_AdvSendAdvertisements && !(pi->pi_flags & IFF_ROUTER)) {
514 logmsg(LOG_INFO, "No longer a router on %s\n", pi->pi_name);
515 check_to_advertise(pi, START_FINAL_ADV);
517 pi->pi_AdvSendAdvertisements = 0;
518 pi->pi_sol_state = NO_SOLICIT;
525 if (pi->pi_kernel_state & PI_PRESENT) {
527 if (pi->pi_AdvSendAdvertisements) {
528 if (pi->pi_adv_state == NO_ADV)
529 check_to_advertise(pi, START_INIT_ADV);
531 if (pi->pi_sol_state == NO_SOLICIT)
532 check_to_solicit(pi, START_INIT_SOLICIT);
541 pr = prefix_lookup_name(pi, ifname);
543 pr = prefix_create_name(pi, ifname);
568 (void *)&pi->pi_tmp_token, abuf, sizeof (abuf)),
569 pr->pr_attempts, pi->pi_name);
570 pi->pi_TmpAddrsEnabled = 0;
571 tmptoken_delete(pi);
576 pr->pr_name, inet_ntop(AF_INET6, (void *)&pi->pi_tmp_token,
578 if (!tmptoken_create(pi)) {
582 token = &pi->pi_tmp_token;
622 struct phyint *pi;
656 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
661 pi->pi_kernel_state &= ~PI_PRESENT;
662 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) {
688 for (pi = phyints; pi != NULL; pi = next_pi) {
689 next_pi = pi->pi_next;
694 if (pi->pi_kernel_state & PI_PRESENT) {
695 pi->pi_state |= PI_PRESENT;
698 check_if_removed(pi);
710 check_to_advertise(struct phyint *pi, enum adv_events event)
713 enum adv_states old_state = pi->pi_adv_state;
717 pi->pi_name, (int)event, (int)old_state);
719 delay = advertise_event(pi, event, 0);
727 pi->pi_name, (int)event, (int)old_state,
728 (int)pi->pi_adv_state);
740 advertise_event(struct phyint *pi, enum adv_events event, uint_t elapsed)
746 pi->pi_name, (int)event, elapsed, (int)pi->pi_adv_state);
749 if (!pi->pi_AdvSendAdvertisements)
751 if (pi->pi_flags & IFF_NORTEXCH) {
755 pi->pi_name);
762 pi->pi_adv_state = NO_ADV;
766 if (pi->pi_adv_state == INIT_ADV)
767 return (pi->pi_adv_time_left);
768 pi->pi_adv_count = ND_MAX_INITIAL_RTR_ADVERTISEMENTS;
769 pi->pi_adv_time_left = 0;
770 pi->pi_adv_state = INIT_ADV;
774 if (pi->pi_adv_state == NO_ADV)
776 if (pi->pi_adv_state == FINAL_ADV)
777 return (pi->pi_adv_time_left);
778 pi->pi_adv_count = ND_MAX_FINAL_RTR_ADVERTISEMENTS;
779 pi->pi_adv_time_left = 0;
780 pi->pi_adv_state = FINAL_ADV;
784 if (pi->pi_adv_state == NO_ADV)
786 if (pi->pi_adv_state == SOLICIT_ADV) {
787 if (pi->pi_adv_time_left != 0)
788 return (pi->pi_adv_time_left);
792 if (delay < pi->pi_adv_time_left)
793 pi->pi_adv_time_left = delay;
794 if (pi->pi_adv_time_since_sent < ND_MIN_DELAY_BETWEEN_RAS) {
800 pi->pi_adv_time_left = delay +
802 pi->pi_adv_time_since_sent;
804 pi->pi_adv_state = SOLICIT_ADV;
808 if (pi->pi_adv_state == NO_ADV)
811 if (pi->pi_adv_time_left >= elapsed)
812 pi->pi_adv_time_left -= elapsed;
814 pi->pi_adv_time_left = 0;
817 pi->pi_adv_time_since_sent += elapsed;
825 if (pi->pi_adv_time_left != 0)
826 return (pi->pi_adv_time_left);
829 if (pi->pi_adv_state == FINAL_ADV) {
831 advertise(&v6allnodes, pi, _B_TRUE);
833 advertise(&v6allnodes, pi, _B_FALSE);
835 pi->pi_adv_time_since_sent = 0;
837 switch (pi->pi_adv_state) {
843 pi->pi_adv_state = REG_ADV;
846 pi->pi_adv_time_left =
847 GET_RANDOM(1000 * pi->pi_MinRtrAdvInterval,
848 1000 * pi->pi_MaxRtrAdvInterval);
852 if (--pi->pi_adv_count > 0) {
853 delay = GET_RANDOM(1000 * pi->pi_MinRtrAdvInterval,
854 1000 * pi->pi_MaxRtrAdvInterval);
857 pi->pi_adv_time_left = delay;
859 pi->pi_adv_time_left =
860 GET_RANDOM(1000 * pi->pi_MinRtrAdvInterval,
861 1000 * pi->pi_MaxRtrAdvInterval);
862 pi->pi_adv_state = REG_ADV;
867 if (--pi->pi_adv_count > 0) {
868 pi->pi_adv_time_left =
871 pi->pi_adv_state = NO_ADV;
875 if (pi->pi_adv_state != NO_ADV)
876 return (pi->pi_adv_time_left);
886 check_to_solicit(struct phyint *pi, enum solicit_events event)
889 enum solicit_states old_state = pi->pi_sol_state;
893 pi->pi_name, (int)event, (int)old_state);
895 delay = solicit_event(pi, event, 0);
903 pi->pi_name, (int)event, (int)old_state,
904 (int)pi->pi_sol_state);
990 struct phyint *pi;
995 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
996 if (!(pi->pi_flags & IFF_NOXMIT))
1004 if (pi == NULL) {
1010 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
1011 if (pi->pi_AdvSendAdvertisements ||
1012 !(pi->pi_kernel_state & PI_PRESENT))
1015 if (pi->pi_sol_state == INIT_SOLICIT)
1030 solicit_event(struct phyint *pi, enum solicit_events event, uint_t elapsed)
1034 pi->pi_name, (int)event, elapsed, (int)pi->pi_sol_state);
1037 if (pi->pi_AdvSendAdvertisements)
1039 if (pi->pi_flags & IFF_NORTEXCH) {
1043 pi->pi_name);
1050 pi->pi_sol_state = NO_SOLICIT;
1055 pi->pi_sol_state = DONE_SOLICIT;
1066 if (pi->pi_sol_state == INIT_SOLICIT)
1067 return (pi->pi_sol_time_left);
1068 pi->pi_sol_count = ND_MAX_RTR_SOLICITATIONS;
1069 pi->pi_sol_time_left =
1071 pi->pi_sol_state = INIT_SOLICIT;
1075 if (pi->pi_sol_state == INIT_SOLICIT)
1076 return (pi->pi_sol_time_left);
1077 pi->pi_ra_flags = 0;
1078 pi->pi_sol_count = ND_MAX_RTR_SOLICITATIONS;
1079 pi->pi_sol_time_left =
1081 pi->pi_sol_state = INIT_SOLICIT;
1085 if (pi->pi_sol_state == NO_SOLICIT)
1088 if (pi->pi_sol_time_left >= elapsed)
1089 pi->pi_sol_time_left -= elapsed;
1091 pi->pi_sol_time_left = 0;
1099 if (pi->pi_sol_time_left != 0)
1100 return (pi->pi_sol_time_left);
1103 switch (pi->pi_sol_state) {
1105 solicit(&v6allrouters, pi);
1106 if (--pi->pi_sol_count == 0) {
1110 pi->pi_name);
1112 if (pi->pi_autoconf && pi->pi_StatefulAddrConf) {
1113 pi->pi_ra_flags |= ND_RA_FLAG_MANAGED |
1115 start_dhcp(pi);
1117 pi->pi_sol_state = DONE_SOLICIT;
1121 pi->pi_sol_time_left = ND_RTR_SOLICITATION_INTERVAL;
1122 return (pi->pi_sol_time_left);
1127 return (pi->pi_sol_time_left);
1233 struct phyint *pi;
1261 for (pi = phyints; pi != NULL; pi = next_pi) {
1262 next_pi = pi->pi_next;
1263 nexti = phyint_timer(pi, elapsed);
1267 logmsg(LOG_DEBUG, "run_timeouts (pi %s): %d -> %u ms\n",
1268 pi->pi_name, nexti, next);
1270 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) {
1280 for (adv_pr = pi->pi_adv_prefix_list; adv_pr != NULL;
1293 for (dr = pi->pi_router_list; dr != NULL; dr = next_dr) {
1303 if (pi->pi_TmpAddrsEnabled) {
1304 nexti = tmptoken_timer(pi, elapsed);
1309 "%d -> %u ms\n", pi->pi_name, nexti, next);
1360 struct phyint *pi;
1395 for (pi = phyints; pi != NULL; pi = next_pi) {
1396 next_pi = pi->pi_next;
1397 if (pi->pi_AdvSendAdvertisements)
1398 check_to_advertise(pi, START_FINAL_ADV);
1406 phyint_delete(pi);
1428 for (pi = phyints; pi != NULL; pi = next_pi) {
1429 next_pi = pi->pi_next;
1430 if (pi->pi_AdvSendAdvertisements)
1431 check_to_advertise(pi, START_FINAL_ADV);
1433 phyint_delete(pi);
1618 struct phyint *pi;
1684 pi = phyint_lookup_on_index(ifm->ifm_index);
1685 if (pi == NULL) {
1694 if (ifm->ifm_flags != (uint_t)pi->pi_flags) {
1698 pi->pi_name, pi->pi_flags, ifm->ifm_flags);
1711 pi->pi_kernel_state &= ~PI_PRESENT;
1712 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) {
1723 if_process(ifsock, pi->pi_name, _B_FALSE);
1724 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) {
1731 if (pi->pi_kernel_state & PI_PRESENT) {
1732 pi->pi_state |= PI_PRESENT;
1734 check_if_removed(pi);
1743 struct phyint *pi;
1766 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
1779 prefix_list = pi->pi_prefix_list;
1788 router_list = pi->pi_router_list;
1796 phyint.phyint_index = pi->pi_index;
1797 bcopy(pi->pi_config,
1808 prefix_list = pi->pi_prefix_list;
1815 prefix.prefix_phyint_index = pi->pi_index;
1833 router_list = pi->pi_router_list;
1839 router.router_phyint_index = pi->pi_index;
1850 * Uses pr_in_use and pi{,_kernel}_state.
1853 check_if_removed(struct phyint *pi)
1863 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) {
1873 } else if (!(pi->pi_kernel_state & PI_PRESENT)) {
1881 "on %s; recreating\n", pi->pi_name);
1894 if (!(pi->pi_kernel_state & PI_PRESENT) &&
1895 (pi->pi_state & PI_PRESENT)) {
1897 "in.ndpd will no longer use it\n", pi->pi_name);
1899 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) {
1910 phyint_cleanup(pi);
1934 loopback_ra_enqueue(struct phyint *pi, struct nd_router_advert *ra, int len)
1943 logmsg(LOG_DEBUG, "loopback_ra_enqueue for %s\n", pi->pi_name);
1958 raq->raq_pi = pi;
2011 struct phyint *pi;
2112 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
2113 if (pollfds[i].fd == pi->pi_sock) {
2114 in_data(pi);
2179 logperror_pi(const struct phyint *pi, const char *str)
2183 str, pi->pi_name);
2187 str, pi->pi_name, strerror(errno));
2332 struct phyint *pi;
2334 pi = phyint_lookup((char *)ifname);
2335 if (pi == NULL) {
2340 pi = phyint_create((char *)ifname);
2341 if (pi == NULL) {
2347 pi->pi_autoconf = enable;
2352 pi->pi_name);
2366 struct phyint *pi;
2371 pi = phyint_lookup((char *)ifname);
2372 if (pi == NULL) {
2377 pi = phyint_create((char *)ifname);
2378 if (pi == NULL) {
2384 } else if (pi->pi_autoconf) {
2388 check_autoconf_var_consistency(pi, stateless, stateful);
2391 pi->pi_default_token = _B_TRUE;
2407 pi->pi_token = sin6->sin6_addr;
2408 pi->pi_token_length = lifr.lifr_addrlen;
2410 pi->pi_default_token = _B_FALSE;
2411 pi->pi_token = intfid.sin6_addr;
2412 pi->pi_token_length = intfidlen;
2414 pi->pi_stateless = stateless;
2415 pi->pi_stateful = stateful;
2416 (void) strlcpy(pi->pi_ipadm_aobjname, addrobj,
2417 sizeof (pi->pi_ipadm_aobjname));
2420 pi->pi_autoconf = _B_TRUE;
2423 if (pi->pi_sol_state == DONE_SOLICIT)
2424 pi->pi_sol_state = NO_SOLICIT;
2425 if (pi->pi_sol_state == NO_SOLICIT)
2426 check_to_solicit(pi, START_INIT_SOLICIT);
2429 "added token to interface %s\n", pi->pi_name);
2440 struct phyint *pi;
2445 pi = phyint_lookup((char *)ifname);
2446 if (pi == NULL) {
2450 if (IN6_IS_ADDR_UNSPECIFIED(&pi->pi_token)) {
2464 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) {
2492 if (pi->pi_stateful) {
2493 (void) strncpy(lifr.lifr_name, pi->pi_name,
2501 release_dhcp(pi);
2508 pi->pi_token = in6addr_any;
2509 pi->pi_token_length = 0;
2510 pi->pi_autoconf = _B_FALSE;
2511 pi->pi_ipadm_aobjname[0] = '\0';
2514 pi->pi_stateless = pi->pi_StatelessAddrConf;
2515 pi->pi_stateful = pi->pi_StatefulAddrConf;
2519 "removed token from interface %s\n", pi->pi_name);
2525 check_autoconf_var_consistency(struct phyint *pi, boolean_t stateless,
2533 if ((pi->pi_StatelessAddrConf !=
2535 stateless != pi->pi_StatelessAddrConf) ||
2536 (pi->pi_StatefulAddrConf !=
2538 stateful != pi->pi_StatefulAddrConf)) {
2542 "interface %s\n", pi->pi_name);
2559 phyint_check_ipadm_intfid(struct phyint *pi)
2573 status = ipadm_addr_info(iph, pi->pi_name, &addrinfo,
2579 pi->pi_autoconf = _B_TRUE;
2588 pi->pi_token = sin6->sin6_addr;
2589 pi->pi_token._S6_un._S6_u32[0] = 0;
2590 pi->pi_token._S6_un._S6_u32[1] = 0;
2591 pi->pi_autoconf = _B_TRUE;
2592 (void) strlcpy(pi->pi_ipadm_aobjname,
2594 sizeof (pi->pi_ipadm_aobjname));
2603 pi->pi_autoconf = _B_FALSE;
2607 pi->pi_autoconf = _B_FALSE;
2611 if (!pi->pi_autoconf) {
2612 pi->pi_token = in6addr_any;
2613 pi->pi_token_length = 0;