Use packet_data() and extract headers using IOV_REMOVE_HEADER()
and IOV_PEEK_HEADER() rather than packet_get().
Signed-off-by: Laurent Vivier
---
iov.c | 1 -
udp.c | 34 +++++++++++++++++++++++-----------
2 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/iov.c b/iov.c
index 147177ab7c0d..80590acfb2ae 100644
--- a/iov.c
+++ b/iov.c
@@ -389,7 +389,6 @@ void *iov_remove_header_(struct iov_tail *tail, void *v, size_t len, size_t alig
* iov array, a negative value if there is not enough room in the
* destination iov array
*/
-/* cppcheck-suppress unusedFunction */
int iov_tail_slice(struct iovec *dst_iov, size_t dst_iov_cnt,
struct iov_tail *tail, size_t *bytes)
{
diff --git a/udp.c b/udp.c
index 40af7dfc260f..27e31bc5d92d 100644
--- a/udp.c
+++ b/udp.c
@@ -872,15 +872,20 @@ int udp_tap_handler(const struct ctx *c, uint8_t pif,
struct iovec m[UIO_MAXIOV];
const struct udphdr *uh;
struct udp_flow *uflow;
- int i, s, count = 0;
+ int i, j, s, count = 0;
+ struct iov_tail data;
flow_sidx_t tosidx;
in_port_t src, dst;
+ struct udphdr uhc;
uint8_t topif;
socklen_t sl;
ASSERT(!c->no_udp);
- uh = packet_get(p, idx, 0, sizeof(*uh), NULL);
+ if (!packet_data(p, idx, &data))
+ return 1;
+
+ uh = IOV_PEEK_HEADER(&data, uhc);
if (!uh)
return 1;
@@ -917,23 +922,30 @@ int udp_tap_handler(const struct ctx *c, uint8_t pif,
pif_sockaddr(c, &to_sa, &sl, topif, &toside->eaddr, toside->eport);
- for (i = 0; i < (int)p->count - idx; i++) {
- struct udphdr *uh_send;
- size_t len;
+ for (i = 0, j = 0; i < (int)p->count - idx && j < UIO_MAXIOV; i++) {
+ const struct udphdr *uh_send;
- uh_send = packet_get(p, idx + i, 0, sizeof(*uh), &len);
+ if (!packet_data(p, idx + i, &data))
+ return p->count - idx;
+
+ uh_send = IOV_REMOVE_HEADER(&data, uhc);
if (!uh_send)
return p->count - idx;
mm[i].msg_hdr.msg_name = &to_sa;
mm[i].msg_hdr.msg_namelen = sl;
- if (len) {
- m[i].iov_base = (char *)(uh_send + 1);
- m[i].iov_len = len;
+ if (data.cnt) {
+ int cnt;
+
+ cnt = iov_tail_slice(&m[j], UIO_MAXIOV - j,
+ &data, NULL);
+ if (cnt < 0)
+ return p->count - idx;
- mm[i].msg_hdr.msg_iov = m + i;
- mm[i].msg_hdr.msg_iovlen = 1;
+ mm[i].msg_hdr.msg_iov = &m[j];
+ mm[i].msg_hdr.msg_iovlen = cnt;
+ j += cnt;
} else {
mm[i].msg_hdr.msg_iov = NULL;
mm[i].msg_hdr.msg_iovlen = 0;
--
2.49.0