aboutsummaryrefslogtreecommitdiff
path: root/platform/linux-generic/pktio/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'platform/linux-generic/pktio/socket.c')
-rw-r--r--platform/linux-generic/pktio/socket.c187
1 files changed, 54 insertions, 133 deletions
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c
index 7d2396866..a383adc6a 100644
--- a/platform/linux-generic/pktio/socket.c
+++ b/platform/linux-generic/pktio/socket.c
@@ -234,6 +234,7 @@ static inline int get_rss_hash_options(int fd, const char *name,
struct ifreq ifr;
struct ethtool_rxnfc rsscmd;
+ memset(&ifr, 0, sizeof(ifr));
memset(&rsscmd, 0, sizeof(rsscmd));
*options = 0;
@@ -461,8 +462,6 @@ static int sock_close(pktio_entry_t *pktio_entry)
return -1;
}
- odp_shm_free(pkt_sock->shm);
-
return 0;
}
@@ -474,13 +473,11 @@ static int sock_setup_pkt(pktio_entry_t *pktio_entry, const char *netdev,
{
int sockfd;
int err;
- int i;
unsigned int if_idx;
struct ifreq ethreq;
struct sockaddr_ll sa_ll;
char shm_name[ODP_SHM_NAME_LEN];
pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock;
- uint8_t *addr;
odp_pktio_stats_t cur_stats;
/* Init pktio entry */
@@ -494,18 +491,6 @@ static int sock_setup_pkt(pktio_entry_t *pktio_entry, const char *netdev,
snprintf(shm_name, ODP_SHM_NAME_LEN, "%s-%s", "pktio", netdev);
shm_name[ODP_SHM_NAME_LEN - 1] = '\0';
- pkt_sock->shm = odp_shm_reserve(shm_name, PACKET_JUMBO_LEN,
- PACKET_JUMBO_LEN *
- ODP_PACKET_SOCKET_MAX_BURST_RX, 0);
- if (pkt_sock->shm == ODP_SHM_INVALID)
- return -1;
-
- addr = odp_shm_addr(pkt_sock->shm);
- for (i = 0; i < ODP_PACKET_SOCKET_MAX_BURST_RX; i++) {
- pkt_sock->cache_ptr[i] = addr;
- addr += PACKET_JUMBO_LEN;
- }
-
sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (sockfd == -1) {
__odp_errno = errno;
@@ -617,19 +602,17 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
odp_packet_t pkt_table[], int len)
{
pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock;
+ odp_pool_t pool = pkt_sock->pool;
odp_time_t ts_val;
odp_time_t *ts = NULL;
const int sockfd = pkt_sock->sockfd;
- int msgvec_len;
- struct mmsghdr msgvec[ODP_PACKET_SOCKET_MAX_BURST_RX];
+ struct mmsghdr msgvec[len];
+ struct iovec iovecs[len][MAX_SEGS];
int nb_rx = 0;
+ int nb_pkts;
int recv_msgs;
- uint8_t **recv_cache;
int i;
- if (odp_unlikely(len > ODP_PACKET_SOCKET_MAX_BURST_RX))
- return -1;
-
odp_ticketlock_lock(&pktio_entry->s.rxl);
if (pktio_entry->s.config.pktin.bit.ts_all ||
@@ -637,131 +620,72 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
ts = &ts_val;
memset(msgvec, 0, sizeof(msgvec));
- recv_cache = pkt_sock->cache_ptr;
- if (pktio_cls_enabled(pktio_entry)) {
- struct iovec iovecs[ODP_PACKET_SOCKET_MAX_BURST_RX];
+ nb_pkts = packet_alloc_multi(pool, pkt_sock->mtu, pkt_table, len);
+ for (i = 0; i < nb_pkts; i++) {
+ msgvec[i].msg_hdr.msg_iovlen =
+ _rx_pkt_to_iovec(pkt_table[i], iovecs[i]);
+ msgvec[i].msg_hdr.msg_iov = iovecs[i];
+ }
+
+ recv_msgs = recvmmsg(sockfd, msgvec, nb_pkts, MSG_DONTWAIT, NULL);
- for (i = 0; i < (int)len; i++) {
- msgvec[i].msg_hdr.msg_iovlen = 1;
- iovecs[i].iov_base = recv_cache[i];
- iovecs[i].iov_len = PACKET_JUMBO_LEN;
- msgvec[i].msg_hdr.msg_iov = &iovecs[i];
- }
- msgvec_len = i;
-
- recv_msgs = recvmmsg(sockfd, msgvec, msgvec_len,
- MSG_DONTWAIT, NULL);
-
- if (ts != NULL)
- ts_val = odp_time_global();
-
- for (i = 0; i < recv_msgs; i++) {
- odp_packet_hdr_t *pkt_hdr;
- odp_packet_t pkt;
- odp_pool_t pool = pkt_sock->pool;
- odp_packet_hdr_t parsed_hdr;
- void *base = msgvec[i].msg_hdr.msg_iov->iov_base;
- struct ethhdr *eth_hdr = base;
- uint16_t pkt_len = msgvec[i].msg_len;
- int num;
-
- /* Don't receive packets sent by ourselves */
- if (odp_unlikely(ethaddrs_equal(pkt_sock->if_mac,
- eth_hdr->h_source)))
- continue;
+ if (ts != NULL)
+ ts_val = odp_time_global();
- if (cls_classify_packet(pktio_entry, base, pkt_len,
- pkt_len, &pool, &parsed_hdr))
- continue;
+ for (i = 0; i < recv_msgs; i++) {
+ void *base = msgvec[i].msg_hdr.msg_iov->iov_base;
+ struct ethhdr *eth_hdr = base;
+ odp_packet_t pkt = pkt_table[i];
+ odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt);
+ uint16_t pkt_len = msgvec[i].msg_len;
+ int ret;
- num = packet_alloc_multi(pool, pkt_len, &pkt, 1);
- if (num != 1)
- continue;
+ if (pktio_cls_enabled(pktio_entry)) {
+ uint16_t seg_len = pkt_len;
- pkt_hdr = odp_packet_hdr(pkt);
+ if (msgvec[i].msg_hdr.msg_iov->iov_len < pkt_len)
+ seg_len = msgvec[i].msg_hdr.msg_iov->iov_len;
- if (odp_packet_copy_from_mem(pkt, 0, pkt_len,
- base) != 0) {
+ if (cls_classify_packet(pktio_entry, base, pkt_len,
+ seg_len, &pool, pkt_hdr)) {
+ ODP_ERR("cls_classify_packet failed");
odp_packet_free(pkt);
continue;
}
- pkt_hdr->input = pktio_entry->s.handle;
- copy_packet_cls_metadata(&parsed_hdr, pkt_hdr);
- packet_set_ts(pkt_hdr, ts);
-
- pkt_table[nb_rx++] = pkt;
}
- } else {
- struct iovec iovecs[ODP_PACKET_SOCKET_MAX_BURST_RX]
- [MAX_SEGS];
-
- for (i = 0; i < (int)len; i++) {
- int num;
- num = packet_alloc_multi(pkt_sock->pool, pkt_sock->mtu,
- &pkt_table[i], 1);
-
- if (odp_unlikely(num != 1)) {
- pkt_table[i] = ODP_PACKET_INVALID;
- break;
- }
-
- msgvec[i].msg_hdr.msg_iovlen =
- _rx_pkt_to_iovec(pkt_table[i], iovecs[i]);
-
- msgvec[i].msg_hdr.msg_iov = iovecs[i];
+ /* Don't receive packets sent by ourselves */
+ if (odp_unlikely(ethaddrs_equal(pkt_sock->if_mac,
+ eth_hdr->h_source))) {
+ odp_packet_free(pkt);
+ continue;
}
- /* number of successfully allocated pkt buffers */
- msgvec_len = i;
-
- recv_msgs = recvmmsg(sockfd, msgvec, msgvec_len,
- MSG_DONTWAIT, NULL);
-
- if (ts != NULL)
- ts_val = odp_time_global();
-
- for (i = 0; i < recv_msgs; i++) {
- void *base = msgvec[i].msg_hdr.msg_iov->iov_base;
- struct ethhdr *eth_hdr = base;
- odp_packet_hdr_t *pkt_hdr;
- odp_packet_t pkt;
- int ret;
-
- pkt = pkt_table[i];
-
- /* Don't receive packets sent by ourselves */
- if (odp_unlikely(ethaddrs_equal(pkt_sock->if_mac,
- eth_hdr->h_source))) {
- odp_packet_free(pkt);
- continue;
- }
+ ret = odp_packet_trunc_tail(&pkt, odp_packet_len(pkt) - pkt_len,
+ NULL, NULL);
+ if (ret < 0) {
+ ODP_ERR("trunk_tail failed");
+ odp_packet_free(pkt);
+ continue;
+ }
- /* Parse and set packet header data */
- ret = odp_packet_trunc_tail(&pkt, odp_packet_len(pkt) -
- msgvec[i].msg_len,
- NULL, NULL);
- if (ret < 0) {
- ODP_ERR("trunk_tail failed");
- odp_packet_free(pkt);
- continue;
- }
+ pkt_hdr->input = pktio_entry->s.handle;
- pkt_hdr = odp_packet_hdr(pkt);
- packet_parse_l2(&pkt_hdr->p, pkt_hdr->frame_len);
- packet_set_ts(pkt_hdr, ts);
- pkt_hdr->input = pktio_entry->s.handle;
+ if (!pktio_cls_enabled(pktio_entry))
+ packet_parse_layer(pkt_hdr,
+ pktio_entry->s.config.parser.layer);
- pkt_table[nb_rx] = pkt;
- nb_rx++;
- }
+ pkt_hdr->input = pktio_entry->s.handle;
+ packet_set_ts(pkt_hdr, ts);
- /* Free unused pkt buffers */
- for (; i < msgvec_len; i++)
- odp_packet_free(pkt_table[i]);
+ pkt_table[nb_rx++] = pkt;
}
+ /* Free unused pkt buffers */
+ for (; i < nb_pkts; i++)
+ odp_packet_free(pkt_table[i]);
+
odp_ticketlock_unlock(&pktio_entry->s.rxl);
return nb_rx;
@@ -793,15 +717,12 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
const odp_packet_t pkt_table[], int len)
{
pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock;
- struct mmsghdr msgvec[ODP_PACKET_SOCKET_MAX_BURST_TX];
- struct iovec iovecs[ODP_PACKET_SOCKET_MAX_BURST_TX][MAX_SEGS];
+ struct mmsghdr msgvec[len];
+ struct iovec iovecs[len][MAX_SEGS];
int ret;
int sockfd;
int n, i;
- if (odp_unlikely(len > ODP_PACKET_SOCKET_MAX_BURST_TX))
- return -1;
-
odp_ticketlock_lock(&pktio_entry->s.txl);
sockfd = pkt_sock->sockfd;