This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "".
The branch, master has been updated via 50c2f41996707fb112feff9f044feddbbe762b78 (commit) via 92b2644a8e6a480cb1fa6477d6cbbb5886d34055 (commit) via 61e1586d93493d97372a6ecd186573a7743c6b35 (commit) via 3d7b31b04083e09a29cbb9d27d2f8750e905fa25 (commit) via ec8014ff0e9aa90b91d1059ff5f2003fe1062bd6 (commit) via ee2c1f7347ae32b2cde77e81dcaffb6afd2c4409 (commit) via b5f34142e905468aedd55a90196c720ddf43341c (commit) from 4d4a1700354eb591c287f6dfad53796c683b6187 (commit)
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- commit 50c2f41996707fb112feff9f044feddbbe762b78 Author: Matias Elo matias.elo@nokia.com Date: Fri Oct 11 14:25:06 2019 +0300
linux-gen: pktio: remove invalid break in sock_recv_mq_tmo_try_int_driven()
Break in the first for loop could cause the following loop to segfault due to an uninitialized value.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Petri Savolainen petri.savolainen@nokia.com Reported-by: Risto Teittinen risto.teittinen@nokia-bell-labs.com
diff --git a/platform/linux-generic/pktio/pktio_common.c b/platform/linux-generic/pktio/pktio_common.c index b19a6f647..e3d5151a7 100644 --- a/platform/linux-generic/pktio/pktio_common.c +++ b/platform/linux-generic/pktio/pktio_common.c @@ -85,10 +85,8 @@ int sock_recv_mq_tmo_try_int_driven(const struct odp_pktin_queue_t queues[], impl = entry[i]->s.ops->recv_mq_tmo; impl_set = 1; } else { - if (impl != entry[i]->s.ops->recv_mq_tmo) { + if (impl != entry[i]->s.ops->recv_mq_tmo) impl = NULL; - break; - } } }
commit 92b2644a8e6a480cb1fa6477d6cbbb5886d34055 Author: Matias Elo matias.elo@nokia.com Date: Fri Oct 11 10:00:27 2019 +0300
linux-gen: socket: prevent receive timeout functions returning too early
Make sure sock_recv_tmo() and sock_recv_mq_tmo() won't return before either packets have been received or the timeout has expired.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Petri Savolainen petri.savolainen@nokia.com
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index a1756b274..a6b399b50 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -331,10 +331,17 @@ static int sock_recv_tmo(pktio_entry_t *pktio_entry, int index, FD_ZERO(&readfds); maxfd = sock_fd_set(pktio_entry, index, &readfds);
- if (select(maxfd + 1, &readfds, NULL, NULL, &timeout) == 0) - return 0; + while (1) { + ret = select(maxfd + 1, &readfds, NULL, NULL, &timeout); + if (ret <= 0) + return 0; + + ret = sock_mmsg_recv(pktio_entry, index, pkt_table, num); + if (odp_likely(ret)) + return ret;
- return sock_mmsg_recv(pktio_entry, index, pkt_table, num); + /* If no packets, continue wait until timeout expires */ + } }
static int sock_recv_mq_tmo(pktio_entry_t *pktio_entry[], int index[], @@ -357,9 +364,6 @@ static int sock_recv_mq_tmo(pktio_entry_t *pktio_entry[], int index[], return ret; }
- timeout.tv_sec = usecs / (1000 * 1000); - timeout.tv_usec = usecs - timeout.tv_sec * (1000ULL * 1000ULL); - FD_ZERO(&readfds);
for (i = 0; i < num_q; i++) { @@ -368,20 +372,27 @@ static int sock_recv_mq_tmo(pktio_entry_t *pktio_entry[], int index[], maxfd = maxfd2; }
- if (select(maxfd + 1, &readfds, NULL, NULL, &timeout) == 0) - return 0; + timeout.tv_sec = usecs / (1000 * 1000); + timeout.tv_usec = usecs - timeout.tv_sec * (1000ULL * 1000ULL);
- for (i = 0; i < num_q; i++) { - ret = sock_mmsg_recv(pktio_entry[i], index[i], pkt_table, num); + while (1) { + ret = select(maxfd + 1, &readfds, NULL, NULL, &timeout); + if (ret <= 0) + return ret;
- if (ret > 0 && from) - *from = i; + for (i = 0; i < num_q; i++) { + ret = sock_mmsg_recv(pktio_entry[i], index[i], + pkt_table, num);
- if (ret != 0) - return ret; - } + if (ret > 0 && from) + *from = i;
- return 0; + if (ret) + return ret; + } + + /* If no packets, continue wait until timeout expires */ + } }
static inline uint32_t _tx_pkt_to_iovec(odp_packet_t pkt, struct iovec *iovecs)
commit 61e1586d93493d97372a6ecd186573a7743c6b35 Author: Matias Elo matias.elo@nokia.com Date: Thu Oct 10 17:15:00 2019 +0300
linux-gen: socket: prevent rx/tx lock false sharing
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Petri Savolainen petri.savolainen@nokia.com
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index efa6b8847..a1756b274 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -30,6 +30,8 @@ #include <odp_classification_internal.h>
typedef struct { + odp_ticketlock_t ODP_ALIGNED_CACHE rx_lock; + odp_ticketlock_t ODP_ALIGNED_CACHE tx_lock; int sockfd; /**< socket descriptor */ odp_pool_t pool; /**< pool to alloc packets from */ uint32_t mtu; /**< maximum transmission unit */ @@ -163,6 +165,9 @@ static int sock_setup_pkt(pktio_entry_t *pktio_entry, const char *netdev, if (err != 0) goto error;
+ odp_ticketlock_init(&pkt_sock->rx_lock); + odp_ticketlock_init(&pkt_sock->tx_lock); + return 0;
error: @@ -226,9 +231,9 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, msgvec[i].msg_hdr.msg_iov = iovecs[i]; }
- odp_ticketlock_lock(&pktio_entry->s.rxl); + odp_ticketlock_lock(&pkt_sock->rx_lock); recv_msgs = recvmmsg(sockfd, msgvec, nb_pkts, MSG_DONTWAIT, NULL); - odp_ticketlock_unlock(&pktio_entry->s.rxl); + odp_ticketlock_unlock(&pkt_sock->rx_lock);
if (pktio_entry->s.config.pktin.bit.ts_all || pktio_entry->s.config.pktin.bit.ts_ptp) { @@ -418,7 +423,7 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, iovecs[i]); }
- odp_ticketlock_lock(&pktio_entry->s.txl); + odp_ticketlock_lock(&pkt_sock->tx_lock);
for (i = 0; i < num; ) { ret = sendmmsg(sockfd, &msgvec[i], num - i, MSG_DONTWAIT); @@ -426,7 +431,7 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, if (i == 0 && SOCK_ERR_REPORT(errno)) { __odp_errno = errno; ODP_ERR("sendmmsg(): %s\n", strerror(errno)); - odp_ticketlock_unlock(&pktio_entry->s.txl); + odp_ticketlock_unlock(&pkt_sock->tx_lock); return -1; } break; @@ -435,7 +440,7 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, i += ret; }
- odp_ticketlock_unlock(&pktio_entry->s.txl); + odp_ticketlock_unlock(&pkt_sock->tx_lock);
odp_packet_free_multi(pkt_table, i);
commit 3d7b31b04083e09a29cbb9d27d2f8750e905fa25 Author: Matias Elo matias.elo@nokia.com Date: Thu Oct 10 16:44:04 2019 +0300
linux-gen: socket: clean up includes
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Petri Savolainen petri.savolainen@nokia.com
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 015239b88..efa6b8847 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -10,41 +10,24 @@ #include <sys/socket.h> #include <stdio.h> #include <stdlib.h> -#include <sys/types.h> -#include <sys/stat.h> #include <linux/if_packet.h> -#include <linux/filter.h> -#include <ctype.h> -#include <fcntl.h> #include <unistd.h> -#include <bits/wordsize.h> -#include <net/ethernet.h> -#include <netinet/ip.h> #include <arpa/inet.h> #include <stdint.h> #include <string.h> #include <net/if.h> -#include <inttypes.h> -#include <poll.h> #include <sys/ioctl.h> #include <errno.h> #include <sys/syscall.h> -#include <linux/ethtool.h> -#include <linux/sockios.h>
#include <odp_api.h> #include <odp_socket_common.h> #include <odp_packet_internal.h> #include <odp_packet_io_internal.h> #include <odp_packet_io_stats.h> -#include <odp_align_internal.h> #include <odp_debug_internal.h> #include <odp_errno_define.h> #include <odp_classification_internal.h> -#include <odp/api/hints.h> - -#include <protocols/eth.h> -#include <protocols/ip.h>
typedef struct { int sockfd; /**< socket descriptor */
commit ec8014ff0e9aa90b91d1059ff5f2003fe1062bd6 Author: Matias Elo matias.elo@nokia.com Date: Thu Oct 10 15:32:34 2019 +0300
linux-gen: socket: optimize rx path performance
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Petri Savolainen petri.savolainen@nokia.com
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 281a8a06d..015239b88 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -199,31 +199,26 @@ static int sock_mmsg_open(odp_pktio_t id ODP_UNUSED,
static inline uint32_t _rx_pkt_to_iovec(odp_packet_t pkt, struct iovec *iovecs) { - odp_packet_seg_t seg = odp_packet_first_seg(pkt); + odp_packet_seg_t seg; uint32_t seg_count = odp_packet_num_segs(pkt); - uint32_t seg_id = 0; - uint32_t iov_count = 0; - uint8_t *ptr; - uint32_t seglen; - - for (seg_id = 0; seg_id < seg_count; ++seg_id) { - ptr = odp_packet_seg_data(pkt, seg); - seglen = odp_packet_seg_data_len(pkt, seg); - - if (ptr) { - iovecs[iov_count].iov_base = ptr; - iovecs[iov_count].iov_len = seglen; - iov_count++; - } - seg = odp_packet_next_seg(pkt, seg); + uint32_t i; + + if (odp_likely(seg_count) == 1) { + iovecs[0].iov_base = odp_packet_data(pkt); + iovecs[0].iov_len = odp_packet_len(pkt); + return 1; }
- return iov_count; + seg = odp_packet_first_seg(pkt); + + for (i = 0; i < seg_count; i++) { + iovecs[i].iov_base = odp_packet_seg_data(pkt, seg); + iovecs[i].iov_len = odp_packet_seg_data_len(pkt, seg); + seg = odp_packet_next_seg(pkt, seg); + } + return i; }
-/* - * ODP_PACKET_SOCKET_MMSG: - */ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, odp_packet_t pkt_table[], int num) { @@ -239,12 +234,6 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, int recv_msgs; int i;
- odp_ticketlock_lock(&pktio_entry->s.rxl); - - if (pktio_entry->s.config.pktin.bit.ts_all || - pktio_entry->s.config.pktin.bit.ts_ptp) - ts = &ts_val; - memset(msgvec, 0, sizeof(msgvec));
nb_pkts = packet_alloc_multi(pool, pkt_sock->mtu, pkt_table, num); @@ -254,10 +243,15 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, msgvec[i].msg_hdr.msg_iov = iovecs[i]; }
+ odp_ticketlock_lock(&pktio_entry->s.rxl); recv_msgs = recvmmsg(sockfd, msgvec, nb_pkts, MSG_DONTWAIT, NULL); + odp_ticketlock_unlock(&pktio_entry->s.rxl);
- if (ts != NULL) + if (pktio_entry->s.config.pktin.bit.ts_all || + pktio_entry->s.config.pktin.bit.ts_ptp) { ts_val = odp_time_global(); + ts = &ts_val; + }
for (i = 0; i < recv_msgs; i++) { void *base = msgvec[i].msg_hdr.msg_iov->iov_base; @@ -309,17 +303,14 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, pktio_entry->s.config.parser.layer, pktio_entry->s.in_chksums);
- pkt_hdr->input = pktio_entry->s.handle; packet_set_ts(pkt_hdr, ts);
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); + if (i < nb_pkts) + odp_packet_free_multi(&pkt_table[i], nb_pkts - i);
return nb_rx; }
commit ee2c1f7347ae32b2cde77e81dcaffb6afd2c4409 Author: Matias Elo matias.elo@nokia.com Date: Thu Oct 10 15:32:13 2019 +0300
linux-gen: socket: optimize tx path performance
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Petri Savolainen petri.savolainen@nokia.com
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 04c0cc788..281a8a06d 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -407,24 +407,25 @@ static int sock_recv_mq_tmo(pktio_entry_t *pktio_entry[], int index[],
static inline uint32_t _tx_pkt_to_iovec(odp_packet_t pkt, struct iovec *iovecs) { - uint32_t pkt_len = odp_packet_len(pkt); - uint32_t offset = 0; - uint32_t iov_count = 0; - uint32_t seglen = 0; - - while (offset < pkt_len) { - iovecs[iov_count].iov_base = odp_packet_offset(pkt, offset, - &seglen, NULL); - iovecs[iov_count].iov_len = seglen; - iov_count++; - offset += seglen; + odp_packet_seg_t seg; + int seg_count = odp_packet_num_segs(pkt); + int i; + + if (odp_likely(seg_count == 1)) { + iovecs[0].iov_base = odp_packet_data(pkt); + iovecs[0].iov_len = odp_packet_len(pkt); + return 1; } - return iov_count; + + seg = odp_packet_first_seg(pkt); + for (i = 0; i < seg_count; i++) { + iovecs[i].iov_base = odp_packet_seg_data(pkt, seg); + iovecs[i].iov_len = odp_packet_seg_data_len(pkt, seg); + seg = odp_packet_next_seg(pkt, seg); + } + return i; }
-/* - * ODP_PACKET_SOCKET_MMSG: - */ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, const odp_packet_t pkt_table[], int num) { @@ -432,20 +433,19 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, struct mmsghdr msgvec[num]; struct iovec iovecs[num][CONFIG_PACKET_MAX_SEGS]; int ret; - int sockfd; - int n, i; - - odp_ticketlock_lock(&pktio_entry->s.txl); + int sockfd = pkt_sock->sockfd; + int i;
- sockfd = pkt_sock->sockfd; memset(msgvec, 0, sizeof(msgvec));
for (i = 0; i < num; i++) { msgvec[i].msg_hdr.msg_iov = iovecs[i]; msgvec[i].msg_hdr.msg_iovlen = _tx_pkt_to_iovec(pkt_table[i], - iovecs[i]); + iovecs[i]); }
+ odp_ticketlock_lock(&pktio_entry->s.txl); + for (i = 0; i < num; ) { ret = sendmmsg(sockfd, &msgvec[i], num - i, MSG_DONTWAIT); if (odp_unlikely(ret <= -1)) { @@ -463,8 +463,7 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
odp_ticketlock_unlock(&pktio_entry->s.txl);
- for (n = 0; n < i; ++n) - odp_packet_free(pkt_table[n]); + odp_packet_free_multi(pkt_table, i);
return i; }
commit b5f34142e905468aedd55a90196c720ddf43341c Author: Matias Elo matias.elo@nokia.com Date: Thu Oct 10 15:30:16 2019 +0300
linux-gen: socket: clean up standard socket pktio implementation
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Petri Savolainen petri.savolainen@nokia.com
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index e7e0971c9..04c0cc788 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -1,5 +1,5 @@ /* Copyright (c) 2013-2018, Linaro Limited - * Copyright (c) 2013, Nokia Solutions and Networks + * Copyright (c) 2013-2019, Nokia Solutions and Networks * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause @@ -40,17 +40,12 @@ #include <odp_align_internal.h> #include <odp_debug_internal.h> #include <odp_errno_define.h> -#include <odp_classification_datamodel.h> -#include <odp_classification_inlines.h> #include <odp_classification_internal.h> #include <odp/api/hints.h>
#include <protocols/eth.h> #include <protocols/ip.h>
-#define MAX_SEGS CONFIG_PACKET_MAX_SEGS -#define PACKET_JUMBO_LEN (9 * 1024) - typedef struct { int sockfd; /**< socket descriptor */ odp_pool_t pool; /**< pool to alloc packets from */ @@ -102,22 +97,6 @@ int sendmmsg(int fd, struct mmsghdr *vmessages, unsigned int vlen, int flags)
#endif } - -/** Eth buffer start offset from u32-aligned address to make sure the following - * header (e.g. IP) starts at a 32-bit aligned address. - */ -#define ETHBUF_OFFSET (ODP_ALIGN_ROUNDUP(_ODP_ETHHDR_LEN, sizeof(uint32_t)) \ - - _ODP_ETHHDR_LEN) - -/** Round up buffer address to get a properly aliged eth buffer, i.e. aligned - * so that the next header always starts at a 32bit aligned address. - */ -#define ETHBUF_ALIGN(buf_ptr) ((uint8_t *)ODP_ALIGN_ROUNDUP_PTR((buf_ptr), \ - sizeof(uint32_t)) + ETHBUF_OFFSET) - -/* - * ODP_PACKET_SOCKET_MMSG: - */ static int sock_close(pktio_entry_t *pktio_entry) { pkt_sock_t *pkt_sock = pkt_priv(pktio_entry); @@ -131,9 +110,6 @@ static int sock_close(pktio_entry_t *pktio_entry) return 0; }
-/* - * ODP_PACKET_SOCKET_MMSG: - */ static int sock_setup_pkt(pktio_entry_t *pktio_entry, const char *netdev, odp_pool_t pool) { @@ -212,9 +188,6 @@ error: return -1; }
-/* - * ODP_PACKET_SOCKET_MMSG: - */ static int sock_mmsg_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry, const char *devname, odp_pool_t pool) @@ -224,8 +197,7 @@ static int sock_mmsg_open(odp_pktio_t id ODP_UNUSED, return sock_setup_pkt(pktio_entry, devname, pool); }
-static uint32_t _rx_pkt_to_iovec(odp_packet_t pkt, - struct iovec iovecs[MAX_SEGS]) +static inline uint32_t _rx_pkt_to_iovec(odp_packet_t pkt, struct iovec *iovecs) { odp_packet_seg_t seg = odp_packet_first_seg(pkt); uint32_t seg_count = odp_packet_num_segs(pkt); @@ -261,7 +233,7 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, odp_time_t *ts = NULL; const int sockfd = pkt_sock->sockfd; struct mmsghdr msgvec[num]; - struct iovec iovecs[num][MAX_SEGS]; + struct iovec iovecs[num][CONFIG_PACKET_MAX_SEGS]; int nb_rx = 0; int nb_pkts; int recv_msgs; @@ -433,8 +405,7 @@ static int sock_recv_mq_tmo(pktio_entry_t *pktio_entry[], int index[], return 0; }
-static uint32_t _tx_pkt_to_iovec(odp_packet_t pkt, - struct iovec iovecs[MAX_SEGS]) +static inline uint32_t _tx_pkt_to_iovec(odp_packet_t pkt, struct iovec *iovecs) { uint32_t pkt_len = odp_packet_len(pkt); uint32_t offset = 0; @@ -459,7 +430,7 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, { pkt_sock_t *pkt_sock = pkt_priv(pktio_entry); struct mmsghdr msgvec[num]; - struct iovec iovecs[num][MAX_SEGS]; + struct iovec iovecs[num][CONFIG_PACKET_MAX_SEGS]; int ret; int sockfd; int n, i; @@ -498,17 +469,11 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, return i; }
-/* - * ODP_PACKET_SOCKET_MMSG: - */ static uint32_t sock_mtu_get(pktio_entry_t *pktio_entry) { return pkt_priv(pktio_entry)->mtu; }
-/* - * ODP_PACKET_SOCKET_MMSG: - */ static int sock_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr) { @@ -516,9 +481,6 @@ static int sock_mac_addr_get(pktio_entry_t *pktio_entry, return ETH_ALEN; }
-/* - * ODP_PACKET_SOCKET_MMSG: - */ static int sock_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable) { @@ -526,9 +488,6 @@ static int sock_promisc_mode_set(pktio_entry_t *pktio_entry, pktio_entry->s.name, enable); }
-/* - * ODP_PACKET_SOCKET_MMSG: - */ static int sock_promisc_mode_get(pktio_entry_t *pktio_entry) { return promisc_mode_get_fd(pkt_priv(pktio_entry)->sockfd, @@ -564,9 +523,7 @@ static int sock_stats(pktio_entry_t *pktio_entry, return 0; }
- return sock_stats_fd(pktio_entry, - stats, - pkt_priv(pktio_entry)->sockfd); + return sock_stats_fd(pktio_entry, stats, pkt_priv(pktio_entry)->sockfd); }
static int sock_stats_reset(pktio_entry_t *pktio_entry) @@ -577,8 +534,7 @@ static int sock_stats_reset(pktio_entry_t *pktio_entry) return 0; }
- return sock_stats_reset_fd(pktio_entry, - pkt_priv(pktio_entry)->sockfd); + return sock_stats_reset_fd(pktio_entry, pkt_priv(pktio_entry)->sockfd); }
static int sock_init_global(void)
-----------------------------------------------------------------------
Summary of changes: platform/linux-generic/pktio/pktio_common.c | 4 +- platform/linux-generic/pktio/socket.c | 227 +++++++++++----------------- 2 files changed, 87 insertions(+), 144 deletions(-)
hooks/post-receive