aboutsummaryrefslogtreecommitdiffstats
path: root/editcap.c
diff options
context:
space:
mode:
authorJonas Falkevik <jonas.falkevik@gmail.com>2021-11-09 15:46:47 +0100
committerAndersBroman <a.broman58@gmail.com>2023-01-04 09:40:03 +0000
commit49b639e5ba4af86f757b661ecd2c250f1974114f (patch)
treeb1524f6cc733b4bfc94312f27b24d558dfe42292 /editcap.c
parent3e2c04fe7839ec920efd3da309013b89a16cff60 (diff)
editcap: add sll and sll2 headers + offsetof
add sll and sll2 header structs to enable the usage of offsetof into the structs. mainly to make it clear on where to read and set data.
Diffstat (limited to 'editcap.c')
-rw-r--r--editcap.c57
1 files changed, 47 insertions, 10 deletions
diff --git a/editcap.c b/editcap.c
index 67cfc3bc89..51d556f5f8 100644
--- a/editcap.c
+++ b/editcap.c
@@ -23,6 +23,7 @@
#include <string.h>
#include <stdarg.h>
#include <math.h>
+#include <stddef.h>
#include <time.h>
#include <glib.h>
@@ -543,36 +544,69 @@ set_rel_time(char *optarg_str_p)
return TRUE;
}
-#define LINUX_SLL_OFFSETP 14
+#define SLL_ADDRLEN 8 /* length of address field */
+struct sll_header {
+ uint16_t sll_pkttype; /* packet type */
+ uint16_t sll_hatype; /* link-layer address type */
+ uint16_t sll_halen; /* link-layer address length */
+ uint8_t sll_addr[SLL_ADDRLEN]; /* link-layer address */
+ uint16_t sll_protocol; /* protocol */
+};
+
+struct sll2_header {
+ uint16_t sll2_protocol; /* protocol */
+ uint16_t sll2_reserved_mbz; /* reserved - must be zero */
+ uint32_t sll2_if_index; /* 1-based interface index */
+ uint16_t sll2_hatype; /* link-layer address type */
+ uint8_t sll2_pkttype; /* packet type */
+ uint8_t sll2_halen; /* link-layer address length */
+ uint8_t sll2_addr[SLL_ADDRLEN]; /* link-layer address */
+};
+
#define VLAN_SIZE 4
static void
sll_remove_vlan_info(guint8* fd, guint32* len) {
- if (pntoh16(fd + LINUX_SLL_OFFSETP) == ETHERTYPE_VLAN) {
+ if (pntoh16(fd + offsetof(struct sll_header, sll_protocol)) == ETHERTYPE_VLAN) {
int rest_len;
/* point to start of vlan */
- fd = fd + LINUX_SLL_OFFSETP;
+ fd = fd + offsetof(struct sll_header, sll_protocol);
/* bytes to read after vlan info */
- rest_len = *len - (LINUX_SLL_OFFSETP + VLAN_SIZE);
+ rest_len = *len - (offsetof(struct sll_header, sll_protocol) + VLAN_SIZE);
/* remove vlan info from packet */
memmove(fd, fd + VLAN_SIZE, rest_len);
*len -= 4;
}
}
-#define LINUX_SLL_OFFSETLL 4
-#define SLL_ADDRLEN 8 /* length of address field */
+
+
static void
sll_set_unused_info(guint8* fd) {
guint32 ha_len;
- ha_len = pntoh16(fd + LINUX_SLL_OFFSETLL);
+ ha_len = pntoh16(fd + offsetof(struct sll_header, sll_halen));
if (ha_len < SLL_ADDRLEN) {
int unused;
unused = SLL_ADDRLEN - ha_len;
- /* point to start of LL address offset plus addr len 2 bytes */
- fd = fd + LINUX_SLL_OFFSETLL + 2;
+ /* point to end of sll_ddr */
+ fd = fd + offsetof(struct sll_header, sll_addr) + ha_len;
/* set zeros in the unused data */
- memset(fd + ha_len, 0, unused);
+ memset(fd, 0, unused);
+ }
+}
+
+static void
+sll2_set_unused_info(guint8* fd) {
+ guint32 ha_len;
+ ha_len = *(fd + offsetof(struct sll2_header, sll2_halen));
+
+ if (ha_len < SLL_ADDRLEN) {
+ int unused;
+ unused = SLL_ADDRLEN - ha_len;
+ /* point to end of sll2_addr */
+ fd = fd + offsetof(struct sll2_header, sll2_addr) + ha_len;
+ /* set zeros in the unused data */
+ memset(fd, 0, unused);
}
}
@@ -594,6 +628,9 @@ set_unused_info(const wtap_packet_header *phdr, guint8* fd) {
case WTAP_ENCAP_SLL:
sll_set_unused_info(fd);
break;
+ case WTAP_ENCAP_SLL2:
+ sll2_set_unused_info(fd);
+ break;
default:
/* no support for current pkt_encap */
break;