static int lw_ap_sock_open(struct lw_psr_port_priv *psr_ppriv) { struct lw_ap_port_priv *ap_ppriv = lw_ap_ppriv_get(psr_ppriv); struct sock_fprog fprog; struct sock_filter arp_vlan_rpl_flt[ARRAY_SIZE(arp_vlan_rpl_flt)]; if (ap_ppriv->vlanid_in_use) { memcpy(&arp_vlan_rpl_flt, arp_vlan_rpl_fprog.filter, sizeof(arp_vlan_rpl_flt)); fprog = arp_vlan_rpl_fprog; fprog.filter = arp_vlan_rpl_flt; SET_FILTER_VLANID(&fprog, ap_ppriv->vlanid); } else { fprog = arp_novlan_rpl_fprog; } return teamd_packet_sock_open(&psr_ppriv->sock, psr_ppriv->common.tdport->ifindex, htons(ETH_P_ARP), &fprog, &arp_rpl_fprog); }
static int lw_nsnap_sock_open(struct lw_psr_port_priv *psr_ppriv) { struct lw_nsnap_port_priv *nsnap_ppriv = lw_nsnap_ppriv_get(psr_ppriv); int err; /* * We use two sockets here. NS packets are send through ICMP6 socket. * With this socket, unfortunately, kernel does not provide a way to * deliver incoming ICMP6 packet on inactive ports into userspace. * So we use packet socket to get these packets. */ err = teamd_packet_sock_open(&psr_ppriv->sock, psr_ppriv->common.tdport->ifindex, htons(ETH_P_ALL), &na_fprog, NULL); if (err) return err; err = icmp6_sock_open(&nsnap_ppriv->tx_sock); if (err) goto close_packet_sock; return 0; close_packet_sock: close(psr_ppriv->sock); return err; }