static void vlan_read_ifnames(struct nlmsghdr *h, size_t len, int del, struct hostapd_data *hapd) { struct ifinfomsg *ifi; int attrlen, nlmsg_len, rta_len; struct rtattr *attr; if (len < sizeof(*ifi)) return; ifi = NLMSG_DATA(h); nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg)); attrlen = h->nlmsg_len - nlmsg_len; if (attrlen < 0) return; attr = (struct rtattr *) (((char *) ifi) + nlmsg_len); rta_len = RTA_ALIGN(sizeof(struct rtattr)); while (RTA_OK(attr, attrlen)) { char ifname[IFNAMSIZ + 1]; if (attr->rta_type == IFLA_IFNAME) { int n = attr->rta_len - rta_len; if (n < 0) break; os_memset(ifname, 0, sizeof(ifname)); if ((size_t) n > sizeof(ifname)) n = sizeof(ifname); os_memcpy(ifname, ((char *) attr) + rta_len, n); if (del) vlan_dellink(ifname, hapd); else vlan_newlink(ifname, hapd); } attr = RTA_NEXT(attr, attrlen); } }
static int vlan_dynamic_add(struct hostapd_data *hapd, struct hostapd_vlan *vlan) { while (vlan) { if (vlan->vlan_id != VLAN_ID_WILDCARD) { if (vlan_if_add(hapd, vlan, 1)) { wpa_printf(MSG_ERROR, "VLAN: Could not add VLAN %s: %s", vlan->ifname, strerror(errno)); return -1; } #ifdef CONFIG_FULL_DYNAMIC_VLAN vlan_newlink(vlan->ifname, hapd); #endif /* CONFIG_FULL_DYNAMIC_VLAN */ } vlan = vlan->next; } return 0; }
static void vlan_read_ifnames(struct nlmsghdr *h, size_t len, int del, struct hostapd_data *hapd) { struct ifinfomsg *ifi; int attrlen, nlmsg_len, rta_len; struct rtattr *attr; char ifname[IFNAMSIZ + 1]; if (len < sizeof(*ifi)) return; ifi = NLMSG_DATA(h); nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg)); attrlen = h->nlmsg_len - nlmsg_len; if (attrlen < 0) return; attr = (struct rtattr *) (((char *) ifi) + nlmsg_len); os_memset(ifname, 0, sizeof(ifname)); rta_len = RTA_ALIGN(sizeof(struct rtattr)); while (RTA_OK(attr, attrlen)) { if (attr->rta_type == IFLA_IFNAME) { int n = attr->rta_len - rta_len; if (n < 0) break; if ((size_t) n >= sizeof(ifname)) n = sizeof(ifname) - 1; os_memcpy(ifname, ((char *) attr) + rta_len, n); } attr = RTA_NEXT(attr, attrlen); } if (!ifname[0]) return; if (del && if_nametoindex(ifname)) { /* interface still exists, race condition -> * iface has just been recreated */ return; } wpa_printf(MSG_DEBUG, "VLAN: RTM_%sLINK: ifi_index=%d ifname=%s ifi_family=%d ifi_flags=0x%x (%s%s%s%s)", del ? "DEL" : "NEW", ifi->ifi_index, ifname, ifi->ifi_family, ifi->ifi_flags, (ifi->ifi_flags & IFF_UP) ? "[UP]" : "", (ifi->ifi_flags & IFF_RUNNING) ? "[RUNNING]" : "", (ifi->ifi_flags & IFF_LOWER_UP) ? "[LOWER_UP]" : "", (ifi->ifi_flags & IFF_DORMANT) ? "[DORMANT]" : ""); if (del) vlan_dellink(ifname, hapd); else vlan_newlink(ifname, hapd); }