static struct full_dynamic_vlan * full_dynamic_vlan_init(struct hostapd_data *hapd) { struct sockaddr_nl local; struct full_dynamic_vlan *priv; priv = os_zalloc(sizeof(*priv)); if (priv == NULL) return NULL; #ifndef CONFIG_VLAN_NETLINK vlan_set_name_type(hapd->conf->ssid.vlan_naming == DYNAMIC_VLAN_NAMING_WITH_DEVICE ? VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD : VLAN_NAME_TYPE_PLUS_VID_NO_PAD); #endif /* CONFIG_VLAN_NETLINK */ priv->s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (priv->s < 0) { wpa_printf(MSG_ERROR, "VLAN: %s: socket(PF_NETLINK,SOCK_RAW," "NETLINK_ROUTE) failed: %s", __func__, strerror(errno)); os_free(priv); return NULL; } os_memset(&local, 0, sizeof(local)); local.nl_family = AF_NETLINK; local.nl_groups = RTMGRP_LINK; if (bind(priv->s, (struct sockaddr *) &local, sizeof(local)) < 0) { wpa_printf(MSG_ERROR, "VLAN: %s: bind(netlink) failed: %s", __func__, strerror(errno)); close(priv->s); os_free(priv); return NULL; } if (eloop_register_read_sock(priv->s, vlan_event_receive, hapd, NULL)) { close(priv->s); os_free(priv); return NULL; } return priv; }
static struct full_dynamic_vlan * full_dynamic_vlan_init(struct hostapd_data *hapd) { struct sockaddr_nl local; struct full_dynamic_vlan *priv; priv = malloc(sizeof(*priv)); if (priv == NULL) return NULL; memset(priv, 0, sizeof(*priv)); vlan_set_name_type(VLAN_NAME_TYPE_PLUS_VID_NO_PAD); priv->s = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (priv->s < 0) { perror("socket(PF_NETLINK,SOCK_RAW,NETLINK_ROUTE)"); free(priv); return NULL; } memset(&local, 0, sizeof(local)); local.nl_family = AF_NETLINK; local.nl_groups = RTMGRP_LINK; if (bind(priv->s, (struct sockaddr *) &local, sizeof(local)) < 0) { perror("bind(netlink)"); close(priv->s); free(priv); return NULL; } if (eloop_register_read_sock(priv->s, vlan_event_receive, hapd, NULL)) { close(priv->s); free(priv); return NULL; } return priv; }