Lines Matching defs:pi
35 static void phyint_print(struct phyint *pi);
36 static void phyint_insert(struct phyint *pi);
41 static void prefix_insert(struct phyint *pi, struct prefix *pr);
47 static void adv_prefix_insert(struct phyint *pi, struct adv_prefix *adv_pr);
51 static void router_insert(struct phyint *pi, struct router *dr);
63 struct phyint *pi;
68 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
69 if (strcmp(pi->pi_name, name) == 0)
72 return (pi);
78 struct phyint *pi;
83 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
84 if (pi->pi_index == ifindex)
87 return (pi);
93 struct phyint *pi;
99 pi = (struct phyint *)calloc(sizeof (struct phyint), 1);
100 if (pi == NULL) {
104 (void) strncpy(pi->pi_name, name, sizeof (pi->pi_name));
105 pi->pi_name[sizeof (pi->pi_name) - 1] = '\0';
113 pi->pi_config[i].cf_value = ifdefaults[i].cf_value;
124 if (pi->pi_TmpMaxDesyncFactor != 0) {
127 pi->pi_TmpDesyncFactor = rand() % pi->pi_TmpMaxDesyncFactor;
129 pi->pi_TmpDesyncFactor++;
131 pi->pi_TmpRegenCountdown = TIMER_INFINITY;
133 pi->pi_sock = -1;
134 pi->pi_stateless = pi->pi_StatelessAddrConf;
135 pi->pi_stateful = pi->pi_StatefulAddrConf;
136 pi->pi_autoconf = _B_TRUE;
137 pi->pi_default_token = _B_TRUE;
138 if (phyint_init_from_k(pi) == -1) {
139 free(pi);
142 phyint_insert(pi);
143 if (pi->pi_sock != -1) {
144 if (poll_add(pi->pi_sock) == -1) {
145 phyint_delete(pi);
149 return (pi);
154 phyint_insert(struct phyint *pi)
157 pi->pi_next = phyints;
158 pi->pi_prev = NULL;
160 phyints->pi_prev = pi;
161 phyints = pi;
171 phyint_init_from_k(struct phyint *pi)
182 logmsg(LOG_DEBUG, "phyint_init_from_k(%s)\n", pi->pi_name);
186 if (pi->pi_sock < 0) {
187 pi->pi_sock = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6);
188 if (pi->pi_sock < 0) {
189 logperror_pi(pi, "phyint_init_from_k: socket");
196 fd = pi->pi_sock;
198 (void) strncpy(lifr.lifr_name, pi->pi_name, sizeof (lifr.lifr_name));
203 (void) close(pi->pi_sock);
204 pi->pi_sock = -1;
208 "not exist\n", pi->pi_name);
212 logperror_pi(pi, "phyint_init_from_k: SIOCGLIFINDEX");
216 if (!newsock && (pi->pi_index != lifr.lifr_index)) {
223 phyint_cleanup(pi);
227 pi->pi_index = lifr.lifr_index;
230 logperror_pi(pi, "phyint_init_from_k: ioctl (get flags)");
233 pi->pi_flags = lifr.lifr_flags;
239 if (!(pi->pi_flags & IFF_UP) || (pi->pi_flags & IFF_NOLOCAL)) {
241 (void) close(pi->pi_sock);
242 pi->pi_sock = -1;
247 "IFF_NOLOCAL or not IFF_UP\n", pi->pi_name);
251 pi->pi_kernel_state |= PI_PRESENT;
254 logperror_pi(pi, "phyint_init_from_k: ioctl (get mtu)");
257 pi->pi_mtu = lifr.lifr_mtu;
260 logperror_pi(pi, "phyint_init_from_k: SIOCGLIFADDR");
264 pi->pi_ifaddr = sin6->sin6_addr;
266 if (pi->pi_autoconf && pi->pi_default_token) {
268 logperror_pi(pi, "phyint_init_from_k: SIOCGLIFTOKEN");
275 pi->pi_name);
278 pi->pi_token = sin6->sin6_addr;
279 pi->pi_token_length = lifr.lifr_addrlen;
286 if (pi->pi_flags & IFF_POINTOPOINT) {
288 logperror_pi(pi, "phyint_init_from_k: SIOCGLIFDSTADDR");
295 pi->pi_dst_token = in6addr_any;
297 pi->pi_dst_token = sin6->sin6_addr;
299 pi->pi_dst_token.s6_addr[0] = 0;
300 pi->pi_dst_token.s6_addr[1] &= 0x3f;
303 pi->pi_dst_token = in6addr_any;
311 pi->pi_LinkMTU = pi->pi_mtu;
312 pi->pi_CurHopLimit = 0;
313 pi->pi_BaseReachableTime = ND_REACHABLE_TIME;
314 phyint_reach_random(pi, _B_FALSE);
315 pi->pi_RetransTimer = ND_RETRANS_TIMER;
319 IPV6_BOUND_IF, (char *)&pi->pi_index,
320 sizeof (pi->pi_index)) < 0) {
321 logperror_pi(pi, "phyint_init_from_k: setsockopt "
329 logperror_pi(pi, "phyint_init_from_k: setsockopt "
336 logperror_pi(pi, "phyint_init_from_k: setsockopt "
342 v6mcastr.ipv6mr_interface = pi->pi_index;
347 * when `pi' has been placed into an IPMP group and we
353 (void) strlcpy(lifr.lifr_name, pi->pi_name, LIFNAMSIZ);
357 logperror_pi(pi, "phyint_init_from_k: "
362 pi->pi_state |= PI_JOINED_ALLNODES;
363 pi->pi_kernel_state |= PI_JOINED_ALLNODES;
375 logperror_pi(pi, "phyint_init_from_k: setsockopt "
383 logperror_pi(pi, "phyint_init_from_k: setsockopt "
389 logperror_pi(pi, "phyint_init_from_k: setsockopt "
395 if (pi->pi_AdvSendAdvertisements &&
396 !(pi->pi_kernel_state & PI_JOINED_ALLROUTERS)) {
398 v6mcastr.ipv6mr_interface = pi->pi_index;
405 (void) strlcpy(lifr.lifr_name, pi->pi_name, LIFNAMSIZ);
409 logperror_pi(pi, "phyint_init_from_k: "
414 pi->pi_state |= PI_JOINED_ALLROUTERS;
415 pi->pi_kernel_state |= PI_JOINED_ALLROUTERS;
424 (void) strncpy(lifr.lifr_name, pi->pi_name, sizeof (lifr.lifr_name));
427 logperror_pi(pi, "phyint_init_from_k: SIOCGLIFFLAGS");
430 if (!(lifr.lifr_flags & IFF_ROUTER) && pi->pi_AdvSendAdvertisements) {
434 logperror_pi(pi, "phyint_init_from_k: SIOCSLIFFLAGS");
437 pi->pi_flags = lifr.lifr_flags;
441 (void) strncpy(lifr.lifr_name, pi->pi_name, sizeof (lifr.lifr_name));
443 lifr.lifr_ifinfo.lir_maxhops = pi->pi_CurHopLimit;
444 lifr.lifr_ifinfo.lir_reachtime = pi->pi_ReachableTime;
445 lifr.lifr_ifinfo.lir_reachretrans = pi->pi_RetransTimer;
449 logperror_pi(pi, "phyint_init_from_k: SIOCSLIFLNKINFO");
454 pi->pi_name);
460 pi->pi_kernel_state &= ~PI_PRESENT;
462 (void) close(pi->pi_sock);
463 pi->pi_sock = -1;
473 phyint_delete(struct phyint *pi)
476 logmsg(LOG_DEBUG, "phyint_delete(%s)\n", pi->pi_name);
480 while (pi->pi_router_list)
481 router_delete(pi->pi_router_list);
482 while (pi->pi_prefix_list) {
483 prefix_update_ipadm_addrobj(pi->pi_prefix_list, _B_FALSE);
484 prefix_delete(pi->pi_prefix_list);
486 while (pi->pi_adv_prefix_list)
487 adv_prefix_delete(pi->pi_adv_prefix_list);
489 if (pi->pi_sock != -1) {
490 (void) poll_remove(pi->pi_sock);
491 if (close(pi->pi_sock) < 0) {
492 logperror_pi(pi, "phyint_delete: close");
494 pi->pi_sock = -1;
497 if (pi->pi_prev == NULL) {
498 if (phyints == pi)
499 phyints = pi->pi_next;
501 pi->pi_prev->pi_next = pi->pi_next;
503 if (pi->pi_next != NULL)
504 pi->pi_next->pi_prev = pi->pi_prev;
505 pi->pi_next = pi->pi_prev = NULL;
506 free(pi);
518 phyint_timer(struct phyint *pi, uint_t elapsed)
522 if (pi->pi_AdvSendAdvertisements) {
523 if (pi->pi_adv_state != NO_ADV) {
524 int old_state = pi->pi_adv_state;
528 "state %d\n", pi->pi_name, (int)old_state);
530 next = advertise_event(pi, ADV_TIMER, elapsed);
534 pi->pi_name, (int)old_state,
535 (int)pi->pi_adv_state);
539 if (pi->pi_sol_state != NO_SOLICIT) {
540 int old_state = pi->pi_sol_state;
544 "state %d\n", pi->pi_name, (int)old_state);
546 next = solicit_event(pi, SOL_TIMER, elapsed);
550 pi->pi_name, (int)old_state,
551 (int)pi->pi_sol_state);
560 if ((pi->pi_AdvSendAdvertisements && (pi->pi_adv_state != NO_ADV)) ||
561 (!pi->pi_AdvSendAdvertisements &&
562 (pi->pi_sol_state != NO_SOLICIT))) {
563 pi->pi_reach_time_since_random += elapsed;
564 if (pi->pi_reach_time_since_random >= MAX_REACH_RANDOM_INTERVAL)
565 phyint_reach_random(pi, _B_TRUE);
572 phyint_print(struct phyint *pi)
581 pi->pi_name, pi->pi_index, pi->pi_state, pi->pi_kernel_state,
582 pi->pi_num_k_routers);
584 inet_ntop(AF_INET6, (void *)&pi->pi_ifaddr,
585 abuf, sizeof (abuf)), pi->pi_flags);
586 logmsg(LOG_DEBUG, "\tsock %d mtu %d\n", pi->pi_sock, pi->pi_mtu);
587 logmsg(LOG_DEBUG, "\ttoken: len %d %s\n", pi->pi_token_length,
588 inet_ntop(AF_INET6, (void *)&pi->pi_token,
590 if (pi->pi_TmpAddrsEnabled) {
592 inet_ntop(AF_INET6, (void *)&pi->pi_tmp_token,
596 pi->pi_TmpPreferredLifetime, pi->pi_TmpValidLifetime,
597 pi->pi_TmpMaxDesyncFactor, pi->pi_TmpDesyncFactor,
598 pi->pi_TmpRegenAdvance);
600 if (pi->pi_flags & IFF_POINTOPOINT) {
602 inet_ntop(AF_INET6, (void *)&pi->pi_dst_token,
607 pi->pi_LinkMTU, pi->pi_CurHopLimit, pi->pi_BaseReachableTime,
608 pi->pi_ReachableTime, pi->pi_RetransTimer);
609 if (!pi->pi_AdvSendAdvertisements) {
612 pi->pi_sol_time_left, pi->pi_sol_state, pi->pi_sol_count);
617 pi->pi_adv_time_left, pi->pi_adv_state, pi->pi_adv_count,
618 pi->pi_adv_time_since_sent);
619 print_iflist(pi->pi_config);
621 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next)
624 for (adv_pr = pi->pi_adv_prefix_list; adv_pr != NULL;
629 for (dr = pi->pi_router_list; dr != NULL; dr = dr->dr_next)
637 * Store the LLA for the phyint `pi' `lifrp'. Returns 0 on success, or
644 phyint_get_lla(struct phyint *pi, struct lifreq *lifrp)
649 if (!(pi->pi_flags & IFF_MULTICAST) ||
650 (pi->pi_flags & IFF_POINTOPOINT)) {
654 (void) strlcpy(lifrp->lifr_name, pi->pi_name, LIFNAMSIZ);
657 sin6->sin6_addr = pi->pi_ifaddr;
658 if (ioctl(pi->pi_sock, SIOCLIFGETND, lifrp) < 0) {
665 if (!(pi->pi_flags & IFF_IPMP) || errno != ESRCH)
666 logperror_pi(pi, "phyint_get_lla: SIOCLIFGETND");
673 * Randomize pi->pi_ReachableTime.
680 phyint_reach_random(struct phyint *pi, boolean_t set_needed)
684 pi->pi_ReachableTime = GET_RANDOM(
685 (int)(ND_MIN_RANDOM_FACTOR * pi->pi_BaseReachableTime),
686 (int)(ND_MAX_RANDOM_FACTOR * pi->pi_BaseReachableTime));
689 (void) strlcpy(lifr.lifr_name, pi->pi_name, LIFNAMSIZ);
690 lifr.lifr_ifinfo.lir_reachtime = pi->pi_ReachableTime;
691 if (ioctl(pi->pi_sock, SIOCSLIFLNKINFO, (char *)&lifr) < 0) {
692 logperror_pi(pi,
697 pi->pi_reach_time_since_random = 0;
715 struct phyint *pi;
739 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
740 if (((pi->pi_token_length == TMP_TOKEN_BITS) &&
741 IN6_ARE_ADDR_EQUAL(&pi->pi_token, token)) ||
742 IN6_ARE_ADDR_EQUAL(&pi->pi_tmp_token, token))
759 tmptoken_create(struct phyint *pi)
795 pi->pi_name, pi->pi_name);
796 pi->pi_TmpAddrsEnabled = 0;
800 pi->pi_tmp_token = token;
804 "token %s\n", pi->pi_name,
805 inet_ntop(AF_INET6, &pi->pi_tmp_token, buf, sizeof (buf)));
807 pi->pi_TmpRegenCountdown = (pi->pi_TmpPreferredLifetime -
808 pi->pi_TmpDesyncFactor - pi->pi_TmpRegenAdvance) * MILLISEC;
809 if (pi->pi_TmpRegenCountdown != 0)
810 timer_schedule(pi->pi_TmpRegenCountdown);
826 tmptoken_delete(struct phyint *pi)
830 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) {
833 (!token_equal(pr->pr_address, pi->pi_tmp_token,
842 (void) memset(&pi->pi_tmp_token, 0, sizeof (pi->pi_tmp_token));
852 tmptoken_timer(struct phyint *pi, uint_t elapsed)
860 pi->pi_name, (int)elapsed, pi->pi_TmpRegenCountdown);
862 if (!pi->pi_TmpAddrsEnabled ||
863 (pi->pi_TmpRegenCountdown == TIMER_INFINITY))
866 if (pi->pi_TmpRegenCountdown > elapsed) {
867 pi->pi_TmpRegenCountdown -= elapsed;
868 return (pi->pi_TmpRegenCountdown);
876 if (!tmptoken_create(pi))
883 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) {
890 newpr = prefix_create(pi, pr->pr_prefix, pr->pr_prefix_len,
897 (void) inet_ntop(AF_INET6, &pi->pi_tmp_token, tbuf,
900 "(%s, %s, %s)\n", pi->pi_name, pbuf, tbuf);
928 if (!incoming_prefix_addrconf_process(pi, newpr,
934 (void) inet_ntop(AF_INET6, &pi->pi_tmp_token, tbuf,
937 "(%s, %s, %s)\n", pi->pi_name, pbuf, tbuf);
992 prefix_lookup(struct phyint *pi, struct in6_addr prefix, int prefixlen)
998 logmsg(LOG_DEBUG, "prefix_lookup(%s, %s/%u)\n", pi->pi_name,
1003 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) {
1069 prefix_lookup_name(struct phyint *pi, char *name)
1075 pi->pi_name, name);
1080 for (pr = pi->pi_prefix_list; pr != NULL; pr = pr->pr_next) {
1096 struct phyint *pi;
1108 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
1109 otherpr = prefix_lookup(pi, prefix, prefixlen);
1124 prefix_create(struct phyint *pi, struct in6_addr prefix, int prefixlen,
1132 pi->pi_name, inet_ntop(AF_INET6, (void *)&prefix,
1151 prefix_insert(pi, pr);
1160 prefix_create_name(struct phyint *pi, char *name)
1166 pi->pi_name, name);
1175 prefix_insert(pi, pr);
1181 prefix_insert(struct phyint *pi, struct prefix *pr)
1183 pr->pr_next = pi->pi_prefix_list;
1185 if (pi->pi_prefix_list != NULL)
1186 pi->pi_prefix_list->pr_prev = pr;
1187 pi->pi_prefix_list = pr;
1188 pr->pr_physical = pi;
1230 struct phyint *pi = pr->pr_physical;
1244 for (pr2 = pi->pi_prefix_list; pr2 != NULL;
1265 (void) check_to_solicit(pi, RESTART_INIT_SOLICIT);
1367 struct phyint *pi;
1376 pi = pr->pr_physical;
1384 if (pi != NULL)
1385 pi->pi_prefix_list = pr->pr_next;
1404 struct phyint *pi = pr->pr_physical;
1419 strcmp(pr->pr_name, pi->pi_name) == 0) {
1422 pi->pi_name, onflags, offflags);
1428 if (ioctl(pi->pi_sock, SIOCGLIFFLAGS, (char *)&lifr) < 0) {
1441 if (ioctl(pi->pi_sock, SIOCSLIFFLAGS, (char *)&lifr) < 0) {
1489 struct phyint *pi = pr->pr_physical;
1529 (void) strncpy(lifr.lifr_name, pi->pi_name,
1533 if (ioctl(pi->pi_sock, SIOCLIFADDIF, (char *)&lifr) < 0) {
1576 strcmp(pr->pr_name, pi->pi_name) == 0) {
1578 "name matches if\n", pi->pi_name);
1584 if (ioctl(pi->pi_sock, SIOCLIFREMOVEIF, (char *)&lifr) < 0 &&
1612 if (ioctl(pi->pi_sock, SIOCSLIFADDR, (char *)&lifr) < 0) {
1634 if (ioctl(pi->pi_sock, SIOCSLIFSUBNET, (char *)&lifr) < 0) {
1644 if (pi->pi_flags & IFF_POINTOPOINT) {
1653 pi->pi_dst_token.s6_addr[i];
1662 if (ioctl(pi->pi_sock, SIOCSLIFDSTADDR,
1693 if (ioctl(pi->pi_sock, SIOCSLIFADDR, (char *)&lifr) < 0) {
1729 if (ioctl(pi->pi_sock, SIOCSLIFSUBNET, (char *)&lifr) < 0) {
1760 if (ioctl(pi->pi_sock, SIOCSLIFSUBNET, (char *)&lifr) < 0) {
1920 adv_prefix_lookup(struct phyint *pi, struct in6_addr prefix, int prefixlen)
1927 pi->pi_name, inet_ntop(AF_INET6, (void *)&prefix,
1931 for (adv_pr = pi->pi_adv_prefix_list; adv_pr != NULL;
1944 adv_prefix_create(struct phyint *pi, struct in6_addr prefix, int prefixlen)
1951 pi->pi_name, inet_ntop(AF_INET6, (void *)&prefix,
1965 adv_prefix_insert(pi, adv_pr);
1971 adv_prefix_insert(struct phyint *pi, struct adv_prefix *adv_pr)
1973 adv_pr->adv_pr_next = pi->pi_adv_prefix_list;
1975 if (pi->pi_adv_prefix_list != NULL)
1976 pi->pi_adv_prefix_list->adv_pr_prev = adv_pr;
1977 pi->pi_adv_prefix_list = adv_pr;
1978 adv_pr->adv_pr_physical = pi;
1989 struct phyint *pi;
1998 pi = adv_pr->adv_pr_physical;
2001 if (pi != NULL)
2002 pi->pi_adv_prefix_list = adv_pr->adv_pr_next;
2058 router_lookup(struct phyint *pi, struct in6_addr addr)
2064 logmsg(LOG_DEBUG, "router_lookup(%s, %s)\n", pi->pi_name,
2069 for (dr = pi->pi_router_list; dr != NULL; dr = dr->dr_next) {
2082 router_create(struct phyint *pi, struct in6_addr addr, uint_t lifetime)
2088 logmsg(LOG_DEBUG, "router_create(%s, %s, %u)\n", pi->pi_name,
2100 router_insert(pi, dr);
2108 router_insert(struct phyint *pi, struct router *dr)
2110 dr->dr_next = pi->pi_router_list;
2112 if (pi->pi_router_list != NULL)
2113 pi->pi_router_list->dr_prev = dr;
2114 pi->pi_router_list = dr;
2115 dr->dr_physical = pi;
2126 struct phyint *pi;
2135 pi = dr->dr_physical;
2136 if (dr->dr_inkernel && (pi->pi_kernel_state & PI_PRESENT))
2140 if (pi != NULL)
2141 pi->pi_router_list = dr->dr_next;
2225 struct phyint *pi = dr->dr_physical;
2238 rta_ifp->sdl_index = if_nametoindex(pi->pi_name);
2240 logperror_pi(pi, "router_add_k: if_nametoindex");
2250 logperror_pi(pi, "router_add_k: RTM_ADD");
2255 "only %d for rlen (interface %s)\n", rlen, pi->pi_name);
2259 pi->pi_num_k_routers++;
2269 struct phyint *pi = dr->dr_physical;
2282 rta_ifp->sdl_index = if_nametoindex(pi->pi_name);
2284 logperror_pi(pi, "router_delete_k: if_nametoindex");
2294 logperror_pi(pi, "router_delete_k: RTM_DELETE");
2298 "only %d for rlen (interface %s)\n", rlen, pi->pi_name);
2301 pi->pi_num_k_routers--;
2317 struct phyint *pi;
2319 for (pi = phyints; pi != NULL; pi = pi->pi_next) {
2320 phyint_print(pi);
2325 phyint_cleanup(struct phyint *pi)
2327 pi->pi_state = 0;
2328 pi->pi_kernel_state = 0;
2330 if (pi->pi_AdvSendAdvertisements) {
2331 check_to_advertise(pi, ADV_OFF);
2333 check_to_solicit(pi, SOLICIT_OFF);
2336 while (pi->pi_router_list)
2337 router_delete(pi->pi_router_list);
2338 (void) poll_remove(pi->pi_sock);
2339 (void) close(pi->pi_sock);
2340 pi->pi_sock = -1;
2341 pi->pi_stateless = pi->pi_StatelessAddrConf;
2342 pi->pi_stateful = pi->pi_StatefulAddrConf;
2343 pi->pi_ipadm_aobjname[0] = '\0';
2352 struct phyint *pi = pr->pr_physical;
2364 if (pi->pi_ipadm_aobjname[0] == '\0' ||
2379 status = ipadm_add_aobjname(iph, pi->pi_name, AF_INET6,
2380 pi->pi_ipadm_aobjname, IPADM_ADDR_IPV6_ADDRCONF, lnum);
2382 status = ipadm_delete_aobjname(iph, pi->pi_name, AF_INET6,
2383 pi->pi_ipadm_aobjname, IPADM_ADDR_IPV6_ADDRCONF, lnum);
2388 (add ? "adding" : "deleting"), pi->pi_ipadm_aobjname,