summaryrefslogtreecommitdiffstats
path: root/VNFs/DPPD-PROX
diff options
context:
space:
mode:
authorXavier Simonart <xavier.simonart@intel.com>2020-04-29 01:51:30 +0200
committerXavier Simonart <xavier.simonart@intel.com>2020-05-29 23:28:44 +0200
commit354bfce1e946ec796516b3ae7f3fc677960867ef (patch)
treeac959537d4c33fd66621138c16cff6f6abba1eba /VNFs/DPPD-PROX
parent9e0c77ef5b6569b8db31269916102f5219bffdc9 (diff)
Fix ctrlplane handling vdev
Change-Id: I8f570940d2c4e1fc09ebae03105e436f5caebbd3 Signed-off-by: Xavier Simonart <xavier.simonart@intel.com>
Diffstat (limited to 'VNFs/DPPD-PROX')
-rw-r--r--VNFs/DPPD-PROX/handle_master.c41
1 files changed, 20 insertions, 21 deletions
diff --git a/VNFs/DPPD-PROX/handle_master.c b/VNFs/DPPD-PROX/handle_master.c
index fcc39eb4..b6b123ce 100644
--- a/VNFs/DPPD-PROX/handle_master.c
+++ b/VNFs/DPPD-PROX/handle_master.c
@@ -582,7 +582,7 @@ static int handle_ctrl_plane_f(struct task_base *tbase, __attribute__((unused))
}
ret +=n;
}
- if (poll(&task->arp_fds, 1, prox_cfg.poll_timeout) == POLL_IN) {
+ if ((task->max_vdev_id) && (poll(&task->arp_fds, 1, prox_cfg.poll_timeout) == POLL_IN)) {
struct nlmsghdr * nl_hdr;
int fd = task->arp_fds.fd;
int len;
@@ -592,15 +592,15 @@ static int handle_ctrl_plane_f(struct task_base *tbase, __attribute__((unused))
len = recv(fd, netlink_buf, sizeof(netlink_buf), 0);
if (len < 0) {
plog_err("Failed to recv from netlink: %d\n", errno);
- return errno;
+ return ret;
}
nl_hdr = (struct nlmsghdr *)netlink_buf;
if (nl_hdr->nlmsg_flags & NLM_F_MULTI) {
plog_err("Unexpected multipart netlink message\n");
- return -1;
+ return ret;
}
if ((nl_hdr->nlmsg_type != RTM_NEWNEIGH) && (nl_hdr->nlmsg_type != RTM_DELNEIGH))
- return 0;
+ return ret;
struct ndmsg *ndmsg = (struct ndmsg *)NLMSG_DATA(nl_hdr);
int ndm_family = ndmsg->ndm_family;
@@ -618,52 +618,51 @@ static int handle_ctrl_plane_f(struct task_base *tbase, __attribute__((unused))
break;
}
}
- ret = rte_hash_lookup(task->external_ip_hash, (const void *)&ip);
- if (unlikely(ret < 0)) {
+ int idx = rte_hash_lookup(task->external_ip_hash, (const void *)&ip);
+ if (unlikely(idx < 0)) {
// entry not found for this IP: we did not ask a request.
// This can happen if the kernel updated the ARP table when receiving an ARP_REQUEST
// We must record this, as the ARP entry is now in the kernel table
if (prox_rte_is_zero_ether_addr(&mac)) {
// Timeout or MAC deleted from kernel MAC table
- int ret = rte_hash_del_key(task->external_ip_hash, (const void *)&ip);
+ idx = rte_hash_del_key(task->external_ip_hash, (const void *)&ip);
plogx_dbg("ip "IPv4_BYTES_FMT" removed from external_ip_hash\n", IP4(ip));
- return 0;
+ return ret;
}
- int ret = rte_hash_add_key(task->external_ip_hash, (const void *)&ip);
- if (unlikely(ret < 0)) {
+ idx = rte_hash_add_key(task->external_ip_hash, (const void *)&ip);
+ if (unlikely(idx < 0)) {
// entry not found for this IP: Ignore the reply. This can happen for instance for
// an IP used by management plane.
plogx_dbg("IP "IPv4_BYTES_FMT" not found in external_ip_hash and unable to add it\n", IP4(ip));
- return -1;
+ return ret;
}
- memcpy(&task->external_ip_table[ret].mac, &mac, sizeof(prox_rte_ether_addr));
+ memcpy(&task->external_ip_table[idx].mac, &mac, sizeof(prox_rte_ether_addr));
plogx_dbg("ip "IPv4_BYTES_FMT" added in external_ip_hash with mac "MAC_BYTES_FMT"\n", IP4(ip), MAC_BYTES(mac.addr_bytes));
- return 0;
+ return ret;
}
// entry found for this IP
- uint16_t nb_requests = task->external_ip_table[ret].nb_requests;
+ uint16_t nb_requests = task->external_ip_table[idx].nb_requests;
if (nb_requests == 0) {
- return 0;
+ return ret;
}
- memcpy(&task->external_ip_table[ret].mac, &mac, sizeof(prox_rte_ether_addr));
+ memcpy(&task->external_ip_table[idx].mac, &mac, sizeof(prox_rte_ether_addr));
// If we receive a request from multiple task for the same IP, then we update all tasks
- ret = rte_mempool_get(tbase->l3.arp_pool, (void **)mbufs);
- if (unlikely(ret != 0)) {
+ if (unlikely(rte_mempool_get(tbase->l3.arp_pool, (void **)mbufs) != 0)) {
plog_err("Unable to allocate a mbuf for master to core communication\n");
- return -1;
+ return ret;
}
rte_mbuf_refcnt_set(mbufs[0], nb_requests);
for (int i = 0; i < nb_requests; i++) {
- struct rte_ring *ring = task->external_ip_table[ret].rings[i];
+ struct rte_ring *ring = task->external_ip_table[idx].rings[i];
struct ether_hdr_arp *hdr = rte_pktmbuf_mtod(mbufs[0], struct ether_hdr_arp *);
memcpy(&hdr->arp.data.sha, &mac, sizeof(prox_rte_ether_addr));
tx_ring_ip(tbase, ring, UPDATE_FROM_CTRL, mbufs[0], ip);
plog_dbg("UPDATE_FROM_CTRL ip "IPv4_BYTES_FMT" with mac "MAC_BYTES_FMT"\n", IP4(ip), MAC_BYTES(mac.addr_bytes));
}
- task->external_ip_table[ret].nb_requests = 0;
+ task->external_ip_table[idx].nb_requests = 0;
}
return ret;
}