This patch adds following: 1. option to configure the mac address during create 2. inform usespace, if mac address is being changed in linux
Signed-off-by: Hemant Agrawal <hemant.agra...@nxp.com> --- .../linuxapp/eal/include/exec-env/rte_kni_common.h | 3 +++ lib/librte_eal/linuxapp/kni/kni_misc.c | 6 +++++- lib/librte_eal/linuxapp/kni/kni_net.c | 15 +++++++++++++-- lib/librte_kni/rte_kni.c | 12 ++++++++++++ lib/librte_kni/rte_kni.h | 8 ++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h index 2ac879f..e9fdc73 100644 --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h @@ -80,6 +80,7 @@ enum rte_kni_req_id { RTE_KNI_REQ_UNKNOWN = 0, RTE_KNI_REQ_CHANGE_MTU, RTE_KNI_REQ_CFG_NETWORK_IF, + RTE_KNI_REQ_CHANGE_MAC_ADDR, RTE_KNI_REQ_MAX, }; @@ -92,6 +93,7 @@ struct rte_kni_request { union { uint32_t new_mtu; /**< New MTU */ uint8_t if_up; /**< 1: interface up, 0: interface down */ + uint8_t mac_addr[6]; /**< MAC address for interface */ }; int32_t result; /**< Result for processing request */ } __attribute__((__packed__)); @@ -168,6 +170,7 @@ struct rte_kni_device_info { /* mbuf size */ unsigned mbuf_size; + char macaddr[6]; /**< Mac Address */ }; #define KNI_DEVICE "kni" diff --git a/lib/librte_eal/linuxapp/kni/kni_misc.c b/lib/librte_eal/linuxapp/kni/kni_misc.c index 7590f1f..90879fa 100644 --- a/lib/librte_eal/linuxapp/kni/kni_misc.c +++ b/lib/librte_eal/linuxapp/kni/kni_misc.c @@ -458,12 +458,16 @@ struct kni_net { if (kni->lad_dev) ether_addr_copy(net_dev->dev_addr, kni->lad_dev->dev_addr); - else + else { /* * Generate random mac address. eth_random_addr() is the newer * version of generating mac address in linux kernel. */ random_ether_addr(net_dev->dev_addr); + + /* todo - check if user supplied mac address is available*/ + memcpy(net_dev->dev_addr, dev_info.macaddr, ETH_ALEN); + } ret = register_netdev(net_dev); if (ret) { diff --git a/lib/librte_eal/linuxapp/kni/kni_net.c b/lib/librte_eal/linuxapp/kni/kni_net.c index db9f489..866cbdd 100644 --- a/lib/librte_eal/linuxapp/kni/kni_net.c +++ b/lib/librte_eal/linuxapp/kni/kni_net.c @@ -668,12 +668,23 @@ static int kni_net_set_mac(struct net_device *netdev, void *p) { + int ret; + struct rte_kni_request req; struct sockaddr *addr = p; + struct kni_dev *kni; + + kni = netdev_priv(netdev); + memset(&req, 0, sizeof(req)); + req.req_id = RTE_KNI_REQ_CHANGE_MAC_ADDR; - if (!is_valid_ether_addr((unsigned char *)(addr->sa_data))) + if (!is_valid_ether_addr((unsigned char *)(addr->sa_data))) { return -EADDRNOTAVAIL; + } + memcpy(req.mac_addr, addr->sa_data, netdev->addr_len); memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); - return 0; + ret = kni_net_process_request(kni, &req); + + return (ret == 0 ? req.result : ret); } #ifdef HAVE_CHANGE_CARRIER_CB diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index 52fcd4b..d5a717b 100644 --- a/lib/librte_kni/rte_kni.c +++ b/lib/librte_kni/rte_kni.c @@ -52,6 +52,10 @@ #define MAX_MBUF_BURST_NUM 32 +#ifndef ETH_ADDR_LEN +#define ETH_ADDR_LEN 6 +#endif + /* Maximum number of ring entries */ #define KNI_FIFO_COUNT_MAX 1024 #define KNI_FIFO_SIZE (KNI_FIFO_COUNT_MAX * sizeof(void *) + \ @@ -368,6 +372,8 @@ struct rte_kni * dev_info.group_id = conf->group_id; dev_info.mbuf_size = conf->mbuf_size; + memcpy(dev_info.macaddr, conf->macaddr, ETH_ADDR_LEN); + snprintf(ctx->name, RTE_KNI_NAMESIZE, "%s", intf_name); snprintf(dev_info.name, RTE_KNI_NAMESIZE, "%s", intf_name); @@ -541,6 +547,11 @@ struct rte_kni * req->result = kni->ops.config_network_if(\ kni->ops.port_id, req->if_up); break; + case RTE_KNI_REQ_CHANGE_MAC_ADDR: /* Change MAC Address */ + if (kni->ops.config_mac_address) + req->result = kni->ops.config_mac_address(kni->ops.port_id, + req->mac_addr); + break; default: RTE_LOG(ERR, KNI, "Unknown request id %u\n", req->req_id); req->result = -EINVAL; @@ -735,6 +746,7 @@ struct rte_kni * kni->ops.change_mtu = NULL; kni->ops.config_network_if = NULL; + kni->ops.config_mac_address = NULL; return 0; } void diff --git a/lib/librte_kni/rte_kni.h b/lib/librte_kni/rte_kni.h index 37deb47..5d2a233 100644 --- a/lib/librte_kni/rte_kni.h +++ b/lib/librte_kni/rte_kni.h @@ -59,6 +59,10 @@ struct rte_kni; struct rte_mbuf; +#ifndef ETH_ADDR_LEN +#define ETH_ADDR_LEN 6 +#endif + /** * Structure which has the function pointers for KNI interface. */ @@ -70,6 +74,9 @@ struct rte_kni_ops { /* Pointer to function of configuring network interface */ int (*config_network_if)(uint8_t port_id, uint8_t if_up); + + /* Pointer to function of configuring mac address */ + int (*config_mac_address)(uint8_t port_id, uint8_t mac_addr[6]); }; /** @@ -87,6 +94,7 @@ struct rte_kni_conf { unsigned mbuf_size; /* mbuf size */ struct rte_pci_addr addr; struct rte_pci_id id; + char macaddr[ETH_ADDR_LEN]; /* MAC address assigned to KNI */ __extension__ uint8_t force_bind : 1; /* Flag to bind kernel thread */ -- 1.9.1