From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from gandalf.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id 74F0E5A026A for ; Thu, 8 Dec 2022 09:55:58 +0100 (CET) Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4NSSfy3by3z4xYQ; Thu, 8 Dec 2022 19:55:54 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=201602; t=1670489754; bh=P5VI4lUkpX9/DAX0Y2LEuU8z8gATWhuL8ZBFnX8n048=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qTvwyImCdYjh5EGgUR8vxGcHVGQtV3EFUSKAFN0bj5xkmzbJly5G6RD4q0eWkwVo7 eBk0By8at9OHCVgePXl8mgm8LUF+x41yeNRwmpYgz1iEFv2J1R6q3UUuoV9l6gvH+f M4Jx6buLYCjiiDOr2nvS3iCqSbjYy9mwJ9YrkK6E= From: David Gibson To: Stefano Brivio , passt-dev@passt.top Subject: [PATCH 01/10] pcap: Introduce pcap_frame() helper Date: Thu, 8 Dec 2022 19:55:42 +1100 Message-Id: <20221208085551.1433829-2-david@gibson.dropbear.id.au> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221208085551.1433829-1-david@gibson.dropbear.id.au> References: <20221208085551.1433829-1-david@gibson.dropbear.id.au> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Message-ID-Hash: PBESH6MJB4KXLDGIMI2MQCVON5IWJ3GE X-Message-ID-Hash: PBESH6MJB4KXLDGIMI2MQCVON5IWJ3GE X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: David Gibson X-Mailman-Version: 3.3.3 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: pcap(), pcapm() and pcapmm() duplicate some code, for the actual writing to the capture file. The main purpose pf pcapm() and pcampp() not calling pcap seems to be to avoid repeatedly calling gettimeofday(). We can accomplish that while still sharing code by adding a new helper which takes the packet timestamp as a parameter. Signed-off-by: David Gibson --- pcap.c | 59 +++++++++++++++++++++++----------------------------------- 1 file changed, 23 insertions(+), 36 deletions(-) diff --git a/pcap.c b/pcap.c index 836688d..c9ac5cf 100644 --- a/pcap.c +++ b/pcap.c @@ -65,6 +65,24 @@ struct pcap_pkthdr { uint32_t len; }; +/** + * pcap_frame() - Capture a single frame to pcap file with given timestamp + * @pkt: Pointer to data buffer, including L2 headers + * @len: L2 packet length + * @tv: Timestamp + */ +static void pcap_frame(const char *pkt, size_t len, const struct timeval *tv) +{ + struct pcap_pkthdr h; + + h.tv_sec = tv->tv_sec; + h.tv_usec = tv->tv_usec; + h.caplen = h.len = len; + + if (write(pcap_fd, &h, sizeof(h)) < 0 || write(pcap_fd, pkt, len) < 0) + debug("Cannot log packet, length %lu", len); +} + /** * pcap() - Capture a single frame to pcap file * @pkt: Pointer to data buffer, including L2 headers @@ -72,19 +90,13 @@ struct pcap_pkthdr { */ void pcap(const char *pkt, size_t len) { - struct pcap_pkthdr h; struct timeval tv; if (pcap_fd == -1) return; gettimeofday(&tv, NULL); - h.tv_sec = tv.tv_sec; - h.tv_usec = tv.tv_usec; - h.caplen = h.len = len; - - if (write(pcap_fd, &h, sizeof(h)) < 0 || write(pcap_fd, pkt, len) < 0) - debug("Cannot log packet, length %lu", len); + pcap_frame(pkt, len, &tv); } /** @@ -93,8 +105,6 @@ void pcap(const char *pkt, size_t len) */ void pcapm(const struct msghdr *mh) { - struct pcap_pkthdr h; - struct iovec *iov; struct timeval tv; unsigned int i; @@ -102,24 +112,12 @@ void pcapm(const struct msghdr *mh) return; gettimeofday(&tv, NULL); - h.tv_sec = tv.tv_sec; - h.tv_usec = tv.tv_usec; for (i = 0; i < mh->msg_iovlen; i++) { - iov = &mh->msg_iov[i]; - - h.caplen = h.len = iov->iov_len - 4; + const struct iovec *iov = &mh->msg_iov[i]; - if (write(pcap_fd, &h, sizeof(h)) < 0) - goto fail; - if (write(pcap_fd, (char *)iov->iov_base + 4, - iov->iov_len - 4) < 0) - goto fail; + pcap_frame((char *)iov->iov_base + 4, iov->iov_len - 4, &tv); } - - return; -fail: - debug("Cannot log packet, length %lu", iov->iov_len - 4); } /** @@ -128,7 +126,6 @@ fail: */ void pcapmm(const struct mmsghdr *mmh, unsigned int vlen) { - struct pcap_pkthdr h; struct iovec *iov; struct timeval tv; unsigned int i, j; @@ -137,8 +134,6 @@ void pcapmm(const struct mmsghdr *mmh, unsigned int vlen) return; gettimeofday(&tv, NULL); - h.tv_sec = tv.tv_sec; - h.tv_usec = tv.tv_usec; for (i = 0; i < vlen; i++) { const struct msghdr *mh = &mmh[i].msg_hdr; @@ -146,18 +141,10 @@ void pcapmm(const struct mmsghdr *mmh, unsigned int vlen) for (j = 0; j < mh->msg_iovlen; j++) { iov = &mh->msg_iov[j]; - h.caplen = h.len = iov->iov_len - 4; - - if (write(pcap_fd, &h, sizeof(h)) < 0) - goto fail; - if (write(pcap_fd, (char *)iov->iov_base + 4, - iov->iov_len - 4) < 0) - goto fail; + pcap_frame((char *)iov->iov_base + 4, iov->iov_len - 4, + &tv); } } - return; -fail: - debug("Cannot log packet, length %lu", iov->iov_len - 4); } /** -- 2.38.1