Lines Matching defs:ra_iface

101 struct ra_iface {
102 TAILQ_ENTRY(ra_iface) entry;
132 TAILQ_HEAD(, ra_iface) ra_interfaces;
138 void join_all_routers_mcast_group(struct ra_iface *);
139 void leave_all_routers_mcast_group(struct ra_iface *);
143 struct ra_iface *find_ra_iface_by_id(uint32_t);
144 struct ra_iface *find_ra_iface_by_name(char *);
150 void unref_icmp6ev(struct ra_iface *);
152 void add_new_prefix_to_ra_iface(struct ra_iface *r,
155 void free_ra_iface(struct ra_iface *);
157 void get_interface_prefixes(struct ra_iface *,
159 int build_packet(struct ra_iface *);
160 void build_leaving_packet(struct ra_iface *);
161 void ra_output(struct ra_iface *, struct sockaddr_in6 *);
535 struct ra_iface *ra_iface;
566 ra_iface = find_ra_iface_by_id(send_ra.if_index);
567 if (ra_iface)
568 ra_output(ra_iface, &send_ra.to);
575 ra_iface = find_ra_iface_by_id(if_index);
576 if (ra_iface) {
577 TAILQ_REMOVE(&ra_interfaces, ra_iface, entry);
578 free_ra_iface(ra_iface);
689 join_all_routers_mcast_group(struct ra_iface *ra_iface)
691 if (!event_initialized(&ra_iface->icmp6ev->ev))
693 log_debug("joining multicast group on %s", ra_iface->name);
694 all_routers.ipv6mr_interface = ra_iface->if_index;
695 if (setsockopt(EVENT_FD(&ra_iface->icmp6ev->ev), IPPROTO_IPV6,
697 fatal("IPV6_JOIN_GROUP(%s)", ra_iface->name);
701 leave_all_routers_mcast_group(struct ra_iface *ra_iface)
703 if (!event_initialized(&ra_iface->icmp6ev->ev))
705 log_debug("leaving multicast group on %s", ra_iface->name);
706 all_routers.ipv6mr_interface = ra_iface->if_index;
707 setsockopt(EVENT_FD(&ra_iface->icmp6ev->ev), IPPROTO_IPV6,
711 struct ra_iface*
714 struct ra_iface *ra_iface;
716 TAILQ_FOREACH(ra_iface, &ra_interfaces, entry) {
717 if (ra_iface->if_index == if_index)
718 return ra_iface;
723 struct ra_iface*
726 struct ra_iface *ra_iface;
728 TAILQ_FOREACH(ra_iface, &ra_interfaces, entry) {
729 if (strcmp(ra_iface->name, if_name) == 0)
730 return ra_iface;
763 struct ra_iface *ra_iface;
817 if ((ra_iface = find_ra_iface_by_name(if_name)) != NULL) {
818 ra_iface->link_state = link_state;
821 ra_iface->removed = 1;
825 ra_iface->removed = 1;
828 ra_iface->removed = 1;
831 ra_iface->removed = 1;
832 } else if (ra_iface->rdomain != ifrdomain) {
833 leave_all_routers_mcast_group(ra_iface);
834 unref_icmp6ev(ra_iface);
835 ra_iface->rdomain = ifrdomain;
836 ra_iface->icmp6ev = get_icmp6ev_by_rdomain(ifrdomain);
837 join_all_routers_mcast_group(ra_iface);
838 ra_iface->removed = 0;
841 ra_iface->removed = 0;
843 memcpy(&ra_iface->hw_addr, &hw_addr, sizeof(hw_addr));
873 if ((ra_iface = calloc(1, sizeof(*ra_iface))) == NULL)
876 strlcpy(ra_iface->name, if_name, sizeof(ra_iface->name));
877 strlcpy(ra_iface->conf_name, conf_name,
878 sizeof(ra_iface->conf_name));
880 ra_iface->if_index = if_index;
881 ra_iface->rdomain = ifrdomain;
882 memcpy(&ra_iface->hw_addr, &hw_addr, sizeof(hw_addr));
883 SIMPLEQ_INIT(&ra_iface->prefixes);
885 ra_iface->icmp6ev = get_icmp6ev_by_rdomain(ifrdomain);
886 join_all_routers_mcast_group(ra_iface);
887 TAILQ_INSERT_TAIL(&ra_interfaces, ra_iface, entry);
895 struct ra_iface *ra_iface;
907 TAILQ_FOREACH(ra_iface, &ra_interfaces, entry)
908 ra_iface->removed = 1;
948 TAILQ_FOREACH(ra_iface, &ra_interfaces, entry) {
949 while ((ra_prefix_conf = SIMPLEQ_FIRST(&ra_iface->prefixes))
951 SIMPLEQ_REMOVE_HEAD(&ra_iface->prefixes,
955 ra_iface->prefix_count = 0;
957 if (ra_iface->removed) {
958 log_debug("iface removed: %s", ra_iface->name);
959 build_leaving_packet(ra_iface);
961 &ra_iface->if_index, sizeof(ra_iface->if_index));
966 &frontend_conf->ra_iface_list, ra_iface->conf_name);
968 log_debug("add static prefixes for %s", ra_iface->name);
972 add_new_prefix_to_ra_iface(ra_iface,
979 get_interface_prefixes(ra_iface,
982 if (build_packet(ra_iface)) {
984 if (event_initialized(&ra_iface->icmp6ev->ev))
986 &ra_iface->if_index,
987 sizeof(ra_iface->if_index));
994 free_ra_iface(struct ra_iface *ra_iface)
998 leave_all_routers_mcast_group(ra_iface);
1000 while ((prefix = SIMPLEQ_FIRST(&ra_iface->prefixes)) != NULL) {
1001 SIMPLEQ_REMOVE_HEAD(&ra_iface->prefixes, entry);
1005 unref_icmp6ev(ra_iface);
1006 free(ra_iface);
1035 get_interface_prefixes(struct ra_iface *ra_iface, struct ra_prefix_conf
1049 if (strcmp(ra_iface->name, ifa->ifa_name) != 0)
1058 strlcpy(ifr6.ifr_name, ra_iface->name, sizeof(ifr6.ifr_name));
1076 strlcpy(ifr6.ifr_name, ra_iface->name, sizeof(ifr6.ifr_name));
1090 add_new_prefix_to_ra_iface(ra_iface, &sin6->sin6_addr,
1112 add_new_prefix_to_ra_iface(struct ra_iface *ra_iface, struct in6_addr *addr,
1118 if ((new_ra_prefix_conf = find_ra_prefix_conf(&ra_iface->prefixes, addr,
1122 ra_iface->ltime_decaying = 1;
1138 ra_iface->ltime_decaying = 0;
1139 SIMPLEQ_FOREACH(pc, &ra_iface->prefixes, entry) {
1141 ra_iface->ltime_decaying = 1;
1161 ra_iface->ltime_decaying = 1;
1173 SIMPLEQ_INSERT_TAIL(&ra_iface->prefixes, new_ra_prefix_conf, entry);
1174 ra_iface->prefix_count++;
1178 build_packet(struct ra_iface *ra_iface)
1200 ra_iface->conf_name);
1208 len += sizeof(*ndopt_pi) * ra_iface->prefix_count;
1223 if (len > sizeof(ra_iface->data))
1238 if (ra_iface->removed)
1263 &ra_iface->hw_addr, ETHER_ADDR_LEN);
1276 SIMPLEQ_FOREACH(ra_prefix_conf, &ra_iface->prefixes, entry) {
1391 if (len != ra_iface->datalen || memcmp(buf, ra_iface->data, len)
1393 memcpy(ra_iface->data, buf, len);
1394 ra_iface->datalen = len;
1401 build_leaving_packet(struct ra_iface *ra_iface)
1409 memcpy(ra_iface->data, &ra, sizeof(ra));
1410 ra_iface->datalen = sizeof(ra);
1414 ra_output(struct ra_iface *ra_iface, struct sockaddr_in6 *to)
1422 if (!LINK_STATE_IS_UP(ra_iface->link_state))
1425 if (ra_iface->ltime_decaying)
1427 build_packet(ra_iface);
1430 sndmhdr.msg_iov[0].iov_base = ra_iface->data;
1431 sndmhdr.msg_iov[0].iov_len = ra_iface->datalen;
1440 pi->ipi6_ifindex = ra_iface->if_index;
1449 log_debug("send RA on %s", ra_iface->name);
1451 len = sendmsg(EVENT_FD(&ra_iface->icmp6ev->ev), &sndmhdr, 0);
1453 log_warn("sendmsg on %s", ra_iface->name);
1537 struct ra_iface *ra_iface;
1540 TAILQ_FOREACH (ra_iface, &ra_interfaces, entry) {
1541 if (ra_iface->rdomain == rdomain) {
1542 icmp6ev = ra_iface->icmp6ev;
1572 unref_icmp6ev(struct ra_iface *ra_iface)
1574 struct icmp6_ev *icmp6ev = ra_iface->icmp6ev;
1576 ra_iface->icmp6ev = NULL;
1591 struct ra_iface *ra_iface;
1593 TAILQ_FOREACH (ra_iface, &ra_interfaces, entry) {
1594 if (!event_initialized(&ra_iface->icmp6ev->ev) &&
1595 ra_iface->rdomain == rdomain) {
1596 event_set(&ra_iface->icmp6ev->ev, icmp6sock, EV_READ |
1597 EV_PERSIST, icmp6_receive, ra_iface->icmp6ev);
1598 event_add(&ra_iface->icmp6ev->ev, NULL);
1613 TAILQ_FOREACH (ra_iface, &ra_interfaces, entry) {
1614 if (ra_iface->rdomain == rdomain) {
1615 join_all_routers_mcast_group(ra_iface);
1617 &ra_iface->if_index, sizeof(ra_iface->if_index));