On 2017-02-02 at 06:06:04 +0100, Vadim Kochan <vadi...@gmail.com> wrote: > On Thu, Feb 2, 2017 at 6:37 AM, Vadim Kochan <vadi...@gmail.com> wrote: > > tun interface does not have Ethernet header so lets push Ethernet > > header only if device supports this. > > > > Signed-off-by: Vadim Kochan <vadi...@gmail.com> > > --- > > dev.c | 18 ++++++++++++++++++ > > dev.h | 4 ++++ > > trafgen_l3.c | 15 ++++++++++++--- > > trafgen_proto.c | 5 +++++ > > trafgen_proto.h | 2 ++ > > 5 files changed, 41 insertions(+), 3 deletions(-) > > > > diff --git a/dev.c b/dev.c > > index 2960976..8442c5e 100644 > > --- a/dev.c > > +++ b/dev.c > > @@ -430,3 +430,21 @@ const char *device_addr2str(const unsigned char *addr, > > int alen, int type, > > > > return buf; > > } > > + > > +bool device_is_ether(const char *ifname) > > +{ > > + switch (device_type(ifname)) { > > + case ARPHRD_TUNNEL: > > + case ARPHRD_TUNNEL6: > > + case ARPHRD_LOOPBACK: > > + case ARPHRD_SIT: > > + case ARPHRD_IPDDP: > > + case ARPHRD_IPGRE: > > + case ARPHRD_IP6GRE: > > + case ARPHRD_ETHER: > > + return true; > > + > > + default: > > + return false; > > + } > > +} > > diff --git a/dev.h b/dev.h > > index 06e51d2..6b56fe0 100644 > > --- a/dev.h > > +++ b/dev.h > > @@ -1,6 +1,7 @@ > > #ifndef DEV_H > > #define DEV_H > > > > +#include <stdbool.h> > > #include <sys/socket.h> > > #include "built_in.h" > > > > @@ -19,4 +20,7 @@ extern void device_leave_promiscuous_mode(const char > > *ifname, short oldflags); > > extern const char *device_type2str(uint16_t type); > > extern const char *device_addr2str(const unsigned char *addr, int alen, > > int type, > > char *buf, int blen); > > + > > +extern bool device_is_ether(const char *ifname); > > + > > #endif /* DEV_H */ > > diff --git a/trafgen_l3.c b/trafgen_l3.c > > index 70aefb9..62a7708 100644 > > --- a/trafgen_l3.c > > +++ b/trafgen_l3.c > > @@ -3,9 +3,10 @@ > > * Subject to the GPL, version 2. > > */ > > > > -#include <linux/if_ether.h> > > +#include <net/if_arp.h> > > > > #include "die.h" > > +#include "dev.h" > > #include "csum.h" > > #include "built_in.h" > > #include "trafgen_l2.h" > > @@ -34,7 +35,11 @@ static struct proto_field ipv4_fields[] = { > > > > static void ipv4_header_init(struct proto_hdr *hdr) > > { > > - proto_lower_default_add(hdr, PROTO_ETH); > > + const char *dev = proto_dev_get(); > > + > > + /* In case of tun interface we do not need to create Ethernet > > header */ > > + if (dev && device_mtu(dev) && device_is_ether(dev)) > > + proto_lower_default_add(hdr, PROTO_ETH); > > > > But may be it is better to just check if device_type(dev) != ARPHRD_NONE ?
Yes, I think this is the cleaner solution and also avoid adding future ARPHRD_* constants to device_is_ether. -- You received this message because you are subscribed to the Google Groups "netsniff-ng" group. To unsubscribe from this group and stop receiving emails from it, send an email to netsniff-ng+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.