Lines Matching defs: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);
961 struct phyint *pi;
966 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
967 if (!(pi->pi_flags & IFF_NOXMIT))
975 if (pi == NULL) {
981 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
982 if (pi->pi_AdvSendAdvertisements ||
983 !(pi->pi_kernel_state & PI_PRESENT))
986 if (pi->pi_sol_state == INIT_SOLICIT)
1001 solicit_event(struct phyint *pi, enum solicit_events event, uint_t elapsed)
1005 pi->pi_name, (int)event, elapsed, (int)pi->pi_sol_state);
1008 if (pi->pi_AdvSendAdvertisements)
1010 if (pi->pi_flags & IFF_NORTEXCH) {
1014 pi->pi_name);
1021 pi->pi_sol_state = NO_SOLICIT;
1026 pi->pi_sol_state = DONE_SOLICIT;
1037 if (pi->pi_sol_state == INIT_SOLICIT)
1038 return (pi->pi_sol_time_left);
1039 pi->pi_sol_count = ND_MAX_RTR_SOLICITATIONS;
1040 pi->pi_sol_time_left =
1042 pi->pi_sol_state = INIT_SOLICIT;
1046 if (pi->pi_sol_state == INIT_SOLICIT)
1047 return (pi->pi_sol_time_left);
1048 pi->pi_ra_flags = 0;
1049 pi->pi_sol_count = ND_MAX_RTR_SOLICITATIONS;
1050 pi->pi_sol_time_left =
1052 pi->pi_sol_state = INIT_SOLICIT;
1056 if (pi->pi_sol_state == NO_SOLICIT)
1059 if (pi->pi_sol_time_left >= elapsed)
1060 pi->pi_sol_time_left -= elapsed;
1062 pi->pi_sol_time_left = 0;
1070 if (pi->pi_sol_time_left != 0)
1071 return (pi->pi_sol_time_left);
1074 switch (pi->pi_sol_state) {
1076 solicit(&v6allrouters, pi);
1077 if (--pi->pi_sol_count == 0) {
1081 pi->pi_name);
1083 if (pi->pi_autoconf && pi->pi_StatefulAddrConf) {
1084 pi->pi_ra_flags |= ND_RA_FLAG_MANAGED |
1086 start_dhcp(pi);
1088 pi->pi_sol_state = DONE_SOLICIT;
1092 pi->pi_sol_time_left = ND_RTR_SOLICITATION_INTERVAL;
1093 return (pi->pi_sol_time_left);
1098 return (pi->pi_sol_time_left);
1204 struct phyint *pi;
1232 for (pi = phyints; pi != NULL; pi = next_pi) {
1233 next_pi = pi->pi_next;
1234 nexti = phyint_timer(pi, elapsed);
1238 logmsg(LOG_DEBUG, "run_timeouts (pi %s): %d -> %u ms\n",
1239 pi->pi_name, nexti, next);
1241 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) {
1251 for (adv_pr = pi->pi_adv_prefix_list; adv_pr != NULL;
1264 for (dr = pi->pi_router_list; dr != NULL; dr = next_dr) {
1274 if (pi->pi_TmpAddrsEnabled) {
1275 nexti = tmptoken_timer(pi, elapsed);
1280 "%d -> %u ms\n", pi->pi_name, nexti, next);
1331 struct phyint *pi;
1366 for (pi = phyints; pi != NULL; pi = next_pi) {
1367 next_pi = pi->pi_next;
1368 if (pi->pi_AdvSendAdvertisements)
1369 check_to_advertise(pi, START_FINAL_ADV);
1377 phyint_delete(pi);
1398 for (pi = phyints; pi != NULL; pi = next_pi) {
1399 next_pi = pi->pi_next;
1400 if (pi->pi_AdvSendAdvertisements)
1401 check_to_advertise(pi, START_FINAL_ADV);
1403 phyint_delete(pi);
1587 struct phyint *pi;
1653 pi = phyint_lookup_on_index(ifm->ifm_index);
1654 if (pi == NULL) {
1663 if (ifm->ifm_flags != (uint_t)pi->pi_flags) {
1667 pi->pi_name, pi->pi_flags, ifm->ifm_flags);
1680 pi->pi_kernel_state &= ~PI_PRESENT;
1681 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) {
1692 if_process(ifsock, pi->pi_name, _B_FALSE);
1693 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) {
1700 if (pi->pi_kernel_state & PI_PRESENT) {
1701 pi->pi_state |= PI_PRESENT;
1703 check_if_removed(pi);
1712 struct phyint *pi;
1735 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
1748 prefix_list = pi->pi_prefix_list;
1757 router_list = pi->pi_router_list;
1765 phyint.phyint_index = pi->pi_index;
1766 bcopy(pi->pi_config,
1777 prefix_list = pi->pi_prefix_list;
1784 prefix.prefix_phyint_index = pi->pi_index;
1802 router_list = pi->pi_router_list;
1808 router.router_phyint_index = pi->pi_index;
1819 * Uses pr_in_use and pi{,_kernel}_state.
1822 check_if_removed(struct phyint *pi)
1832 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) {
1842 } else if (!(pi->pi_kernel_state & PI_PRESENT)) {
1850 "on %s; recreating\n", pi->pi_name);
1863 if (!(pi->pi_kernel_state & PI_PRESENT) &&
1864 (pi->pi_state & PI_PRESENT)) {
1866 "in.ndpd will no longer use it\n", pi->pi_name);
1868 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) {
1879 phyint_cleanup(pi);
1903 loopback_ra_enqueue(struct phyint *pi, struct nd_router_advert *ra, int len)
1912 logmsg(LOG_DEBUG, "loopback_ra_enqueue for %s\n", pi->pi_name);
1927 raq->raq_pi = pi;
1980 struct phyint *pi;
2081 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
2082 if (pollfds[i].fd == pi->pi_sock) {
2083 in_data(pi);
2148 logperror_pi(const struct phyint *pi, const char *str)
2152 str, pi->pi_name);
2156 str, pi->pi_name, strerror(errno));
2301 struct phyint *pi;
2303 pi = phyint_lookup((char *)ifname);
2304 if (pi == NULL) {
2309 pi = phyint_create((char *)ifname);
2310 if (pi == NULL) {
2316 pi->pi_autoconf = enable;
2321 pi->pi_name);
2335 struct phyint *pi;
2340 pi = phyint_lookup((char *)ifname);
2341 if (pi == NULL) {
2346 pi = phyint_create((char *)ifname);
2347 if (pi == NULL) {
2353 } else if (pi->pi_autoconf) {
2357 check_autoconf_var_consistency(pi, stateless, stateful);
2360 pi->pi_default_token = _B_TRUE;
2376 pi->pi_token = sin6->sin6_addr;
2377 pi->pi_token_length = lifr.lifr_addrlen;
2379 pi->pi_default_token = _B_FALSE;
2380 pi->pi_token = intfid.sin6_addr;
2381 pi->pi_token_length = intfidlen;
2383 pi->pi_stateless = stateless;
2384 pi->pi_stateful = stateful;
2385 (void) strlcpy(pi->pi_ipadm_aobjname, addrobj,
2386 sizeof (pi->pi_ipadm_aobjname));
2389 pi->pi_autoconf = _B_TRUE;
2392 if (pi->pi_sol_state == DONE_SOLICIT)
2393 pi->pi_sol_state = NO_SOLICIT;
2394 if (pi->pi_sol_state == NO_SOLICIT)
2395 check_to_solicit(pi, START_INIT_SOLICIT);
2398 "added token to interface %s\n", pi->pi_name);
2409 struct phyint *pi;
2414 pi = phyint_lookup((char *)ifname);
2415 if (pi == NULL) {
2419 if (IN6_IS_ADDR_UNSPECIFIED(&pi->pi_token)) {
2433 for (pr = pi->pi_prefix_list; pr != NULL; pr = next_pr) {
2461 if (pi->pi_stateful) {
2462 (void) strncpy(lifr.lifr_name, pi->pi_name,
2470 release_dhcp(pi);
2477 pi->pi_token = in6addr_any;
2478 pi->pi_token_length = 0;
2479 pi->pi_autoconf = _B_FALSE;
2480 pi->pi_ipadm_aobjname[0] = '\0';
2483 pi->pi_stateless = pi->pi_StatelessAddrConf;
2484 pi->pi_stateful = pi->pi_StatefulAddrConf;
2488 "removed token from interface %s\n", pi->pi_name);
2494 check_autoconf_var_consistency(struct phyint *pi, boolean_t stateless,
2502 if ((pi->pi_StatelessAddrConf !=
2504 stateless != pi->pi_StatelessAddrConf) ||
2505 (pi->pi_StatefulAddrConf !=
2507 stateful != pi->pi_StatefulAddrConf)) {
2511 "interface %s\n", pi->pi_name);
2528 phyint_check_ipadm_intfid(struct phyint *pi)
2542 status = ipadm_addr_info(iph, pi->pi_name, &addrinfo,
2548 pi->pi_autoconf = _B_TRUE;
2557 pi->pi_token = sin6->sin6_addr;
2558 pi->pi_token._S6_un._S6_u32[0] = 0;
2559 pi->pi_token._S6_un._S6_u32[1] = 0;
2560 pi->pi_autoconf = _B_TRUE;
2561 (void) strlcpy(pi->pi_ipadm_aobjname,
2563 sizeof (pi->pi_ipadm_aobjname));
2572 pi->pi_autoconf = _B_FALSE;
2576 pi->pi_autoconf = _B_FALSE;
2580 if (!pi->pi_autoconf) {
2581 pi->pi_token = in6addr_any;
2582 pi->pi_token_length = 0;