15a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt/* 25a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * Wired Ethernet driver interface for QCA MACsec driver 35a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * Copyright (c) 2005-2009, Jouni Malinen <j@w1.fi> 45a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * Copyright (c) 2004, Gunter Burchardt <tira@isx.de> 55a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * Copyright (c) 2013-2014, Qualcomm Atheros, Inc. 65a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * 75a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * This software may be distributed under the terms of the BSD license. 85a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt * See README for more details. 95a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt */ 105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "includes.h" 125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include <sys/ioctl.h> 135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include <net/if.h> 145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifdef __linux__ 155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include <netpacket/packet.h> 165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include <net/if_arp.h> 175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include <net/if.h> 185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* __linux__ */ 195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) 205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include <net/if_dl.h> 215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include <net/if_media.h> 225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) */ 235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifdef __sun__ 245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include <sys/sockio.h> 255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* __sun__ */ 265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "utils/common.h" 285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "utils/eloop.h" 295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "common/defs.h" 305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "common/ieee802_1x_defs.h" 315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "driver.h" 325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "nss_macsec_secy.h" 345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "nss_macsec_secy_rx.h" 355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#include "nss_macsec_secy_tx.h" 365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define MAXSC 16 385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt/* TCI field definition */ 405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define TCI_ES 0x40 415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define TCI_SC 0x20 425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define TCI_SCB 0x10 435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define TCI_E 0x08 445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define TCI_C 0x04 455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifdef _MSC_VER 475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#pragma pack(push, 1) 485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* _MSC_VER */ 495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifdef _MSC_VER 515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#pragma pack(pop) 525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* _MSC_VER */ 535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic const u8 pae_group_addr[ETH_ALEN] = 555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 0x01, 0x80, 0xc2, 0x00, 0x00, 0x03 }; 565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct macsec_qca_data { 585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt char ifname[IFNAMSIZ + 1]; 595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u32 secy_id; 605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt void *ctx; 615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int sock; /* raw packet socket for driver access */ 635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int pf_sock; 645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int membership, multi, iff_allmulti, iff_up; 655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /* shadow */ 675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt Boolean always_include_sci; 685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt Boolean use_es; 695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt Boolean use_scb; 705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt Boolean protect_frames; 715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt Boolean replay_protect; 725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u32 replay_window; 735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}; 745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_multicast_membership(int sock, int ifindex, 775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt const u8 *addr, int add) 785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifdef __linux__ 805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct packet_mreq mreq; 815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (sock < 0) 835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&mreq, 0, sizeof(mreq)); 865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt mreq.mr_ifindex = ifindex; 875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt mreq.mr_type = PACKET_MR_MULTICAST; 885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt mreq.mr_alen = ETH_ALEN; 895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memcpy(mreq.mr_address, addr, ETH_ALEN); 905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (setsockopt(sock, SOL_PACKET, 925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt add ? PACKET_ADD_MEMBERSHIP : PACKET_DROP_MEMBERSHIP, 935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt &mreq, sizeof(mreq)) < 0) { 945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt perror("setsockopt"); 955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#else /* __linux__ */ 995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 1005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* __linux__ */ 1015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 1025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_get_ssid(void *priv, u8 *ssid) 1055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 1065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ssid[0] = 0; 1075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 1085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 1095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_get_bssid(void *priv, u8 *bssid) 1125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 1135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /* Report PAE group address as the "BSSID" for macsec connection. */ 1145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memcpy(bssid, pae_group_addr, ETH_ALEN); 1155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 1165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 1175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_get_capa(void *priv, struct wpa_driver_capa *capa) 1205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 1215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(capa, 0, sizeof(*capa)); 1225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt capa->flags = WPA_DRIVER_FLAGS_WIRED; 1235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 1245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 1255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_get_ifflags(const char *ifname, int *flags) 1285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 1295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct ifreq ifr; 1305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int s; 1315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt s = socket(PF_INET, SOCK_DGRAM, 0); 1335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (s < 0) { 1345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt perror("socket"); 1355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 1365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 1375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&ifr, 0, sizeof(ifr)); 1395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ); 1405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (ioctl(s, SIOCGIFFLAGS, (caddr_t) &ifr) < 0) { 1415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt perror("ioctl[SIOCGIFFLAGS]"); 1425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt close(s); 1435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 1445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 1455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt close(s); 1465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt *flags = ifr.ifr_flags & 0xffff; 1475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 1485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 1495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_set_ifflags(const char *ifname, int flags) 1525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 1535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct ifreq ifr; 1545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int s; 1555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt s = socket(PF_INET, SOCK_DGRAM, 0); 1575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (s < 0) { 1585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt perror("socket"); 1595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 1605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 1615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&ifr, 0, sizeof(ifr)); 1635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ); 1645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ifr.ifr_flags = flags & 0xffff; 1655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (ioctl(s, SIOCSIFFLAGS, (caddr_t) &ifr) < 0) { 1665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt perror("ioctl[SIOCSIFFLAGS]"); 1675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt close(s); 1685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 1695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 1705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt close(s); 1715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 1725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 1735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) 1765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_get_ifstatus(const char *ifname, int *status) 1775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 1785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct ifmediareq ifmr; 1795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int s; 1805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt s = socket(PF_INET, SOCK_DGRAM, 0); 1825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (s < 0) { 1835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt perror("socket"); 1845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 1855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 1865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&ifmr, 0, sizeof(ifmr)); 1885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_strlcpy(ifmr.ifm_name, ifname, IFNAMSIZ); 1895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (ioctl(s, SIOCGIFMEDIA, (caddr_t) &ifmr) < 0) { 1905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt perror("ioctl[SIOCGIFMEDIA]"); 1915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt close(s); 1925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 1935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 1945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt close(s); 1955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt *status = (ifmr.ifm_status & (IFM_ACTIVE | IFM_AVALID)) == 1965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt (IFM_ACTIVE | IFM_AVALID); 1975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 1985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 1995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 2005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* defined(__FreeBSD__) || defined(__DragonFly__) || defined(FreeBSD_kernel__) */ 2015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_multi(const char *ifname, const u8 *addr, int add) 2045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 2055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct ifreq ifr; 2065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int s; 2075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifdef __sun__ 2095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 2105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* __sun__ */ 2115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt s = socket(PF_INET, SOCK_DGRAM, 0); 2135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (s < 0) { 2145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt perror("socket"); 2155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 2165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 2175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&ifr, 0, sizeof(ifr)); 2195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_strlcpy(ifr.ifr_name, ifname, IFNAMSIZ); 2205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifdef __linux__ 2215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ifr.ifr_hwaddr.sa_family = AF_UNSPEC; 2225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memcpy(ifr.ifr_hwaddr.sa_data, addr, ETH_ALEN); 2235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* __linux__ */ 2245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) 2255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt { 2265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct sockaddr_dl *dlp; 2275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt dlp = (struct sockaddr_dl *) &ifr.ifr_addr; 2285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt dlp->sdl_len = sizeof(struct sockaddr_dl); 2295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt dlp->sdl_family = AF_LINK; 2305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt dlp->sdl_index = 0; 2315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt dlp->sdl_nlen = 0; 2325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt dlp->sdl_alen = ETH_ALEN; 2335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt dlp->sdl_slen = 0; 2345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memcpy(LLADDR(dlp), addr, ETH_ALEN); 2355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 2365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* defined(__FreeBSD__) || defined(__DragonFly__) || defined(FreeBSD_kernel__) */ 2375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) 2385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt { 2395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct sockaddr *sap; 2405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt sap = (struct sockaddr *) &ifr.ifr_addr; 2415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt sap->sa_len = sizeof(struct sockaddr); 2425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt sap->sa_family = AF_UNSPEC; 2435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memcpy(sap->sa_data, addr, ETH_ALEN); 2445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 2455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) */ 2465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (ioctl(s, add ? SIOCADDMULTI : SIOCDELMULTI, (caddr_t) &ifr) < 0) { 2485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt perror("ioctl[SIOC{ADD/DEL}MULTI]"); 2495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt close(s); 2505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 2515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 2525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt close(s); 2535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 2545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 2555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic void __macsec_drv_init(struct macsec_qca_data *drv) 2585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 2595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 2605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt fal_rx_ctl_filt_t rx_ctl_filt; 2615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt fal_tx_ctl_filt_t tx_ctl_filt; 2625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_INFO, "%s: secy_id=%d", __func__, drv->secy_id); 2645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /* Enable Secy and Let EAPoL bypass */ 2665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret = nss_macsec_secy_en_set(drv->secy_id, TRUE); 2675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (ret) 2685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_ERROR, "nss_macsec_secy_en_set: FAIL"); 2695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret = nss_macsec_secy_sc_sa_mapping_mode_set(drv->secy_id, 2715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt FAL_SC_SA_MAP_1_4); 2725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (ret) 2735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_ERROR, 2745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt "nss_macsec_secy_sc_sa_mapping_mode_set: FAIL"); 2755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&rx_ctl_filt, 0, sizeof(rx_ctl_filt)); 2775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt rx_ctl_filt.bypass = 1; 2785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt rx_ctl_filt.match_type = IG_CTL_COMPARE_ETHER_TYPE; 2795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt rx_ctl_filt.match_mask = 0xffff; 2805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt rx_ctl_filt.ether_type_da_range = 0x888e; 2815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret = nss_macsec_secy_rx_ctl_filt_set(drv->secy_id, 0, &rx_ctl_filt); 2825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (ret) 2835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_ERROR, "nss_macsec_secy_rx_ctl_filt_set: FAIL"); 2845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&tx_ctl_filt, 0, sizeof(tx_ctl_filt)); 2865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt tx_ctl_filt.bypass = 1; 2875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt tx_ctl_filt.match_type = EG_CTL_COMPARE_ETHER_TYPE; 2885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt tx_ctl_filt.match_mask = 0xffff; 2895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt tx_ctl_filt.ether_type_da_range = 0x888e; 2905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret = nss_macsec_secy_tx_ctl_filt_set(drv->secy_id, 0, &tx_ctl_filt); 2915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (ret) 2925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_ERROR, "nss_macsec_secy_tx_ctl_filt_set: FAIL"); 2935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 2945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 2965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic void __macsec_drv_deinit(struct macsec_qca_data *drv) 2975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 2985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt nss_macsec_secy_en_set(drv->secy_id, FALSE); 2995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt nss_macsec_secy_rx_sc_del_all(drv->secy_id); 3005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt nss_macsec_secy_tx_sc_del_all(drv->secy_id); 3015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 3025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic void * macsec_qca_init(void *ctx, const char *ifname) 3055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 3065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv; 3075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int flags; 3085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv = os_zalloc(sizeof(*drv)); 3105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (drv == NULL) 3115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return NULL; 3125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_strlcpy(drv->ifname, ifname, sizeof(drv->ifname)); 3135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->ctx = ctx; 3145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /* Board specific settings */ 3165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (os_memcmp("eth2", drv->ifname, 4) == 0) 3175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->secy_id = 1; 3185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt else if (os_memcmp("eth3", drv->ifname, 4) == 0) 3195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->secy_id = 2; 3205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt else 3215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->secy_id = -1; 3225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifdef __linux__ 3245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->pf_sock = socket(PF_PACKET, SOCK_DGRAM, 0); 3255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (drv->pf_sock < 0) 3265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt perror("socket(PF_PACKET)"); 3275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#else /* __linux__ */ 3285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->pf_sock = -1; 3295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* __linux__ */ 3305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (macsec_qca_get_ifflags(ifname, &flags) == 0 && 3325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt !(flags & IFF_UP) && 3335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt macsec_qca_set_ifflags(ifname, flags | IFF_UP) == 0) { 3345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->iff_up = 1; 3355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 3365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (macsec_qca_multicast_membership(drv->pf_sock, 3385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if_nametoindex(drv->ifname), 3395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt pae_group_addr, 1) == 0) { 3405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, 3415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt "%s: Added multicast membership with packet socket", 3425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__); 3435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->membership = 1; 3445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } else if (macsec_qca_multi(ifname, pae_group_addr, 1) == 0) { 3455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, 3465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt "%s: Added multicast membership with SIOCADDMULTI", 3475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__); 3485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->multi = 1; 3495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } else if (macsec_qca_get_ifflags(ifname, &flags) < 0) { 3505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_INFO, "%s: Could not get interface flags", 3515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__); 3525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_free(drv); 3535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return NULL; 3545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } else if (flags & IFF_ALLMULTI) { 3555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, 3565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt "%s: Interface is already configured for multicast", 3575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__); 3585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } else if (macsec_qca_set_ifflags(ifname, flags | IFF_ALLMULTI) < 0) { 3595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_INFO, "%s: Failed to enable allmulti", 3605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__); 3615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_free(drv); 3625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return NULL; 3635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } else { 3645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: Enabled allmulti mode", __func__); 3655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->iff_allmulti = 1; 3665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 3675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#if defined(__FreeBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) 3685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt { 3695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int status; 3705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: waiting for link to become active", 3715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__); 3725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt while (macsec_qca_get_ifstatus(ifname, &status) == 0 && 3735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt status == 0) 3745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt sleep(1); 3755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 3765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* defined(__FreeBSD__) || defined(__DragonFly__) || defined(FreeBSD_kernel__) */ 3775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return drv; 3795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 3805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic void macsec_qca_deinit(void *priv) 3835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 3845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 3855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int flags; 3865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (drv->membership && 3885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt macsec_qca_multicast_membership(drv->pf_sock, 3895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if_nametoindex(drv->ifname), 3905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt pae_group_addr, 0) < 0) { 3915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, 3925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt "%s: Failed to remove PAE multicast group (PACKET)", 3935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__); 3945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 3955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 3965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (drv->multi && 3975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt macsec_qca_multi(drv->ifname, pae_group_addr, 0) < 0) { 3985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, 3995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt "%s: Failed to remove PAE multicast group (SIOCDELMULTI)", 4005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__); 4015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 4025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (drv->iff_allmulti && 4045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt (macsec_qca_get_ifflags(drv->ifname, &flags) < 0 || 4055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt macsec_qca_set_ifflags(drv->ifname, flags & ~IFF_ALLMULTI) < 0)) { 4065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: Failed to disable allmulti mode", 4075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__); 4085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 4095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (drv->iff_up && 4115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt macsec_qca_get_ifflags(drv->ifname, &flags) == 0 && 4125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt (flags & IFF_UP) && 4135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt macsec_qca_set_ifflags(drv->ifname, flags & ~IFF_UP) < 0) { 4145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: Failed to set the interface down", 4155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__); 4165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 4175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (drv->pf_sock != -1) 4195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt close(drv->pf_sock); 4205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_free(drv); 4225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 4235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_macsec_init(void *priv, struct macsec_init_params *params) 4265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 4275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 4285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->always_include_sci = params->always_include_sci; 4305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->use_es = params->use_es; 4315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->use_scb = params->use_scb; 4325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: es=%d, scb=%d, sci=%d", 4345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__, drv->use_es, drv->use_scb, 4355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->always_include_sci); 4365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __macsec_drv_init(drv); 4385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 4405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 4415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_macsec_deinit(void *priv) 4445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 4455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 4465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s", __func__); 4485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __macsec_drv_deinit(drv); 4505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 4525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 4535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_enable_protect_frames(void *priv, Boolean enabled) 4565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 4575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 4585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 4595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: enabled=%d", __func__, enabled); 4615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->protect_frames = enabled; 4635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 4655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 4665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_set_replay_protect(void *priv, Boolean enabled, 4695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt unsigned int window) 4705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 4715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 4725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 4735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: enabled=%d, win=%u", 4755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__, enabled, window); 4765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->replay_protect = enabled; 4785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->replay_window = window; 4795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 4815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 4825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_set_current_cipher_suite(void *priv, const u8 *cs, 4855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt size_t cs_len) 4865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 4875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u8 default_cs_id[] = CS_ID_GCM_AES_128; 4885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (cs_len != CS_ID_LEN || 4905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memcmp(cs, default_cs_id, cs_len) != 0) { 4915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_hexdump(MSG_ERROR, "macsec: NOT supported CipherSuite", 4925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt cs, cs_len); 4935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 4945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 4955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /* Support default Cipher Suite 0080020001000001 (GCM-AES-128) */ 4975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: default support aes-gcm-128", __func__); 4985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 4995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 5005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 5015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_enable_controlled_port(void *priv, Boolean enabled) 5045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 5055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 5065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 5075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: enable=%d", __func__, enabled); 5095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_controlled_port_en_set(drv->secy_id, enabled); 5115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 5135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 5145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_get_receive_lowest_pn(void *priv, u32 channel, u8 an, 5175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u32 *lowest_pn) 5185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 5195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 5205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 5215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u32 next_pn = 0; 5225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt bool enabled = FALSE; 5235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u32 win; 5245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sa_next_pn_get(drv->secy_id, channel, an, 5265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt &next_pn); 5275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sc_replay_protect_get(drv->secy_id, channel, 5285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt &enabled); 5295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sc_anti_replay_window_get(drv->secy_id, 5305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt channel, &win); 5315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (enabled) 5335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt *lowest_pn = (next_pn > win) ? (next_pn - win) : 1; 5345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt else 5355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt *lowest_pn = next_pn; 5365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: lpn=0x%x", __func__, *lowest_pn); 5385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 5405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 5415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_get_transmit_next_pn(void *priv, u32 channel, u8 an, 5445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u32 *next_pn) 5455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 5465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 5475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 5485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sa_next_pn_get(drv->secy_id, channel, an, 5505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt next_pn); 5515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: npn=0x%x", __func__, *next_pn); 5535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 5555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 5565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtint macsec_qca_set_transmit_next_pn(void *priv, u32 channel, u8 an, u32 next_pn) 5595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 5605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 5615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 5625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sa_next_pn_set(drv->secy_id, channel, an, 5645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt next_pn); 5655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_INFO, "%s: npn=0x%x", __func__, next_pn); 5675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 5695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 5705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_get_available_receive_sc(void *priv, u32 *channel) 5735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 5745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 5755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 5765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u32 sc_ch = 0; 5775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt bool in_use = FALSE; 5785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt for (sc_ch = 0; sc_ch < MAXSC; sc_ch++) { 5805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret = nss_macsec_secy_rx_sc_in_used_get(drv->secy_id, sc_ch, 5815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt &in_use); 5825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (ret) 5835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt continue; 5845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (!in_use) { 5865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt *channel = sc_ch; 5875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: channel=%d", 5885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__, *channel); 5895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 5905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 5915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 5925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: no available channel", __func__); 5945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 5965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 5975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 5995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_create_receive_sc(void *priv, u32 channel, 6005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt const u8 *sci_addr, u16 sci_port, 6015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt unsigned int conf_offset, 6025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int validation) 6035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 6045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 6055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 6065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt fal_rx_prc_lut_t entry; 6075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt fal_rx_sc_validate_frame_e vf; 6085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt enum validate_frames validate_frames = validation; 6095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel); 6115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /* rx prc lut */ 6135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&entry, 0, sizeof(entry)); 6145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memcpy(entry.sci, sci_addr, ETH_ALEN); 6165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt entry.sci[6] = (sci_port >> 8) & 0xf; 6175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt entry.sci[7] = sci_port & 0xf; 6185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt entry.sci_mask = 0xf; 6195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt entry.valid = 1; 6215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt entry.channel = channel; 6225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt entry.action = FAL_RX_PRC_ACTION_PROCESS; 6235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt entry.offset = conf_offset; 6245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /* rx validate frame */ 6265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (validate_frames == Strict) 6275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt vf = FAL_RX_SC_VALIDATE_FRAME_STRICT; 6285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt else if (validate_frames == Checked) 6295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt vf = FAL_RX_SC_VALIDATE_FRAME_CHECK; 6305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt else 6315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt vf = FAL_RX_SC_VALIDATE_FRAME_DISABLED; 6325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_prc_lut_set(drv->secy_id, channel, &entry); 6345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sc_create(drv->secy_id, channel); 6355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sc_validate_frame_set(drv->secy_id, channel, 6365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt vf); 6375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sc_replay_protect_set(drv->secy_id, channel, 6385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->replay_protect); 6395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sc_anti_replay_window_set(drv->secy_id, 6405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt channel, 6415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->replay_window); 6425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 6445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 6455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_delete_receive_sc(void *priv, u32 channel) 6485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 6495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 6505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 6515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt fal_rx_prc_lut_t entry; 6525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel); 6545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /* rx prc lut */ 6565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&entry, 0, sizeof(entry)); 6575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sc_del(drv->secy_id, channel); 6595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_prc_lut_set(drv->secy_id, channel, &entry); 6605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 6625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 6635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_create_receive_sa(void *priv, u32 channel, u8 an, 6665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u32 lowest_pn, const u8 *sak) 6675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 6685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 6695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 6705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt fal_rx_sak_t rx_sak; 6715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int i = 0; 6725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s, channel=%d, an=%d, lpn=0x%x", 6745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__, channel, an, lowest_pn); 6755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&rx_sak, 0, sizeof(rx_sak)); 6775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt for (i = 0; i < 16; i++) 6785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt rx_sak.sak[i] = sak[15 - i]; 6795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sa_create(drv->secy_id, channel, an); 6815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sak_set(drv->secy_id, channel, an, &rx_sak); 6825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 6845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 6855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_enable_receive_sa(void *priv, u32 channel, u8 an) 6885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 6895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 6905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 6915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel, an); 6935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sa_en_set(drv->secy_id, channel, an, TRUE); 6955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 6975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 6985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 6995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_disable_receive_sa(void *priv, u32 channel, u8 an) 7015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 7025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 7035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 7045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel, an); 7065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_rx_sa_en_set(drv->secy_id, channel, an, FALSE); 7085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 7105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 7115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_get_available_transmit_sc(void *priv, u32 *channel) 7145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 7155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 7165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 7175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u32 sc_ch = 0; 7185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt bool in_use = FALSE; 7195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt for (sc_ch = 0; sc_ch < MAXSC; sc_ch++) { 7215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret = nss_macsec_secy_tx_sc_in_used_get(drv->secy_id, sc_ch, 7225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt &in_use); 7235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (ret) 7245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt continue; 7255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (!in_use) { 7275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt *channel = sc_ch; 7285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: channel=%d", 7295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__, *channel); 7305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return 0; 7315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 7325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt } 7335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: no avaiable channel", __func__); 7355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return -1; 7375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 7385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_create_transmit_sc(void *priv, u32 channel, 7415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt const u8 *sci_addr, u16 sci_port, 7425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt unsigned int conf_offset) 7435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 7445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 7455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 7465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt fal_tx_class_lut_t entry; 7475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u8 psci[ETH_ALEN + 2]; 7485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel); 7505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /* class lut */ 7525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&entry, 0, sizeof(entry)); 7535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt entry.valid = 1; 7555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt entry.action = FAL_TX_CLASS_ACTION_FORWARD; 7565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt entry.channel = channel; 7575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memcpy(psci, sci_addr, ETH_ALEN); 7595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt psci[6] = (sci_port >> 8) & 0xf; 7605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt psci[7] = sci_port & 0xf; 7615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_class_lut_set(drv->secy_id, channel, &entry); 7635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sc_create(drv->secy_id, channel, psci, 8); 7645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sc_protect_set(drv->secy_id, channel, 7655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt drv->protect_frames); 7665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sc_confidentiality_offset_set(drv->secy_id, 7675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt channel, 7685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt conf_offset); 7695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 7715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 7725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_delete_transmit_sc(void *priv, u32 channel) 7755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 7765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 7775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 7785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt fal_tx_class_lut_t entry; 7795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: channel=%d", __func__, channel); 7815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt /* class lut */ 7835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&entry, 0, sizeof(entry)); 7845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_class_lut_set(drv->secy_id, channel, &entry); 7865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sc_del(drv->secy_id, channel); 7875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7885a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 7895a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 7905a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7915a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 7925a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_create_transmit_sa(void *priv, u32 channel, u8 an, 7935a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u32 next_pn, Boolean confidentiality, 7945a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt const u8 *sak) 7955a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 7965a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 7975a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 7985a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt u8 tci = 0; 7995a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt fal_tx_sak_t tx_sak; 8005a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int i; 8015a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8025a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, 8035a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt "%s: channel=%d, an=%d, next_pn=0x%x, confidentiality=%d", 8045a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt __func__, channel, an, next_pn, confidentiality); 8055a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8065a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (drv->always_include_sci) 8075a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt tci |= TCI_SC; 8085a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt else if (drv->use_es) 8095a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt tci |= TCI_ES; 8105a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt else if (drv->use_scb) 8115a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt tci |= TCI_SCB; 8125a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8135a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt if (confidentiality) 8145a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt tci |= TCI_E | TCI_C; 8155a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8165a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt os_memset(&tx_sak, 0, sizeof(tx_sak)); 8175a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt for (i = 0; i < 16; i++) 8185a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt tx_sak.sak[i] = sak[15 - i]; 8195a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8205a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sa_next_pn_set(drv->secy_id, channel, an, 8215a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt next_pn); 8225a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sak_set(drv->secy_id, channel, an, &tx_sak); 8235a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sc_tci_7_2_set(drv->secy_id, channel, 8245a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt (tci >> 2)); 8255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sc_an_set(drv->secy_id, channel, an); 8265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 8285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 8295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8315a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_enable_transmit_sa(void *priv, u32 channel, u8 an) 8325a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 8335a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 8345a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 8355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel, an); 8375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8385a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sa_en_set(drv->secy_id, channel, an, TRUE); 8395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8405a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 8415a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 8425a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8435a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8445a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstatic int macsec_qca_disable_transmit_sa(void *priv, u32 channel, u8 an) 8455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt{ 8465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt struct macsec_qca_data *drv = priv; 8475a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt int ret = 0; 8485a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8495a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt wpa_printf(MSG_DEBUG, "%s: channel=%d, an=%d", __func__, channel, an); 8505a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8515a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt ret += nss_macsec_secy_tx_sa_en_set(drv->secy_id, channel, an, FALSE); 8525a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8535a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt return ret; 8545a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} 8555a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8565a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8575a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtconst struct wpa_driver_ops wpa_driver_macsec_qca_ops = { 8585a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .name = "macsec_qca", 8595a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .desc = "QCA MACsec Ethernet driver", 8605a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .get_ssid = macsec_qca_get_ssid, 8615a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .get_bssid = macsec_qca_get_bssid, 8625a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .get_capa = macsec_qca_get_capa, 8635a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .init = macsec_qca_init, 8645a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .deinit = macsec_qca_deinit, 8655a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt 8665a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .macsec_init = macsec_qca_macsec_init, 8675a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .macsec_deinit = macsec_qca_macsec_deinit, 8685a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .enable_protect_frames = macsec_qca_enable_protect_frames, 8695a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .set_replay_protect = macsec_qca_set_replay_protect, 8705a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .set_current_cipher_suite = macsec_qca_set_current_cipher_suite, 8715a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .enable_controlled_port = macsec_qca_enable_controlled_port, 8725a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .get_receive_lowest_pn = macsec_qca_get_receive_lowest_pn, 8735a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .get_transmit_next_pn = macsec_qca_get_transmit_next_pn, 8745a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .set_transmit_next_pn = macsec_qca_set_transmit_next_pn, 8755a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .get_available_receive_sc = macsec_qca_get_available_receive_sc, 8765a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .create_receive_sc = macsec_qca_create_receive_sc, 8775a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .delete_receive_sc = macsec_qca_delete_receive_sc, 8785a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .create_receive_sa = macsec_qca_create_receive_sa, 8795a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .enable_receive_sa = macsec_qca_enable_receive_sa, 8805a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .disable_receive_sa = macsec_qca_disable_receive_sa, 8815a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .get_available_transmit_sc = macsec_qca_get_available_transmit_sc, 8825a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .create_transmit_sc = macsec_qca_create_transmit_sc, 8835a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .delete_transmit_sc = macsec_qca_delete_transmit_sc, 8845a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .create_transmit_sa = macsec_qca_create_transmit_sa, 8855a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .enable_transmit_sa = macsec_qca_enable_transmit_sa, 8865a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt .disable_transmit_sa = macsec_qca_disable_transmit_sa, 8875a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt}; 888