version 1.7, 2015/01/19 23:32:30
|
version 1.8, 2016/08/18 09:06:31
|
Line 12 terms:
|
Line 12 terms:
|
All of the documentation and software included in the ELWIX and AITNET |
All of the documentation and software included in the ELWIX and AITNET |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org> |
|
|
Copyright 2004 - 2014 | Copyright 2004 - 2016 |
by Michael Pounov <misho@elwix.org>. All rights reserved. |
by Michael Pounov <misho@elwix.org>. All rights reserved. |
|
|
Redistribution and use in source and binary forms, with or without |
Redistribution and use in source and binary forms, with or without |
Line 63 io_etherClose(int eth, void **zcbuf)
|
Line 63 io_etherClose(int eth, void **zcbuf)
|
if (eth > STDERR_FILENO) |
if (eth > STDERR_FILENO) |
close(eth); |
close(eth); |
|
|
if (zcbuf && *zcbuf) { |
|
#if defined(__FreeBSD__) && defined(ZCBUF_ENABLE) |
#if defined(__FreeBSD__) && defined(ZCBUF_ENABLE) |
|
if (zcbuf && *zcbuf) { |
zbuf = *zcbuf; |
zbuf = *zcbuf; |
munmap(zbuf->bz_bufb, zbuf->bz_buflen); |
munmap(zbuf->bz_bufb, zbuf->bz_buflen); |
munmap(zbuf->bz_bufa, zbuf->bz_buflen); |
munmap(zbuf->bz_bufa, zbuf->bz_buflen); |
e_free(*zcbuf); |
e_free(*zcbuf); |
*zcbuf = NULL; |
*zcbuf = NULL; |
#endif |
|
} |
} |
|
#endif |
} |
} |
|
|
#if defined(__FreeBSD__) && defined(ZCBUF_ENABLE) |
#if defined(__FreeBSD__) && defined(ZCBUF_ENABLE) |
Line 114 allocZCbuf(u_int len)
|
Line 114 allocZCbuf(u_int len)
|
* @csIface = interface name |
* @csIface = interface name |
* @flags = open flags |
* @flags = open flags |
* @whdr = with complete headers |
* @whdr = with complete headers |
* @wdlt = with data link type | * @wdlt = with data link type, on Linux is protocol number |
* @buflen = buffer length |
* @buflen = buffer length |
* @zcbuf = zero copy buffer, if BPF supports it and isn't NULL |
* @zcbuf = zero copy buffer, if BPF supports it and isn't NULL |
* return: -1 error or >-1 bpf handle |
* return: -1 error or >-1 bpf handle |
Line 124 io_etherOpen(const char *csIface, int flags, u_int whd
|
Line 124 io_etherOpen(const char *csIface, int flags, u_int whd
|
u_int *buflen, void **zcbuf) |
u_int *buflen, void **zcbuf) |
{ |
{ |
int eth = -1; |
int eth = -1; |
register int i; |
|
char szStr[STRSIZ]; |
char szStr[STRSIZ]; |
struct ifreq ifr; |
struct ifreq ifr; |
|
#ifndef __linux__ |
|
register int i; |
u_int n = 1; |
u_int n = 1; |
|
#else |
|
sockaddr_t sa = {{ 0 }}; |
|
#endif |
|
|
#if !defined(__FreeBSD__) || !defined(ZCBUF_ENABLE) |
#if !defined(__FreeBSD__) || !defined(ZCBUF_ENABLE) |
if (zcbuf) { |
if (zcbuf) { |
Line 136 io_etherOpen(const char *csIface, int flags, u_int whd
|
Line 140 io_etherOpen(const char *csIface, int flags, u_int whd
|
} |
} |
#endif |
#endif |
|
|
|
#ifndef __linux__ |
for (i = 0; i < BPF_DEV_MAX; i++) { |
for (i = 0; i < BPF_DEV_MAX; i++) { |
memset(szStr, 0, sizeof szStr); |
memset(szStr, 0, sizeof szStr); |
snprintf(szStr, sizeof szStr, "/dev/bpf%d", i); |
snprintf(szStr, sizeof szStr, "/dev/bpf%d", i); |
Line 143 io_etherOpen(const char *csIface, int flags, u_int whd
|
Line 148 io_etherOpen(const char *csIface, int flags, u_int whd
|
if (eth > STDERR_FILENO) |
if (eth > STDERR_FILENO) |
break; |
break; |
} |
} |
|
#else |
|
eth = socket(AF_PACKET, whdr ? SOCK_RAW : SOCK_DGRAM, htons((u_short) wdlt)); |
|
#endif |
if (eth < 3) { |
if (eth < 3) { |
LOGERR; |
LOGERR; |
return -1; |
return -1; |
Line 155 io_etherOpen(const char *csIface, int flags, u_int whd
|
Line 163 io_etherOpen(const char *csIface, int flags, u_int whd
|
return -1; |
return -1; |
} |
} |
|
|
|
#ifndef __linux__ |
n = 1; |
n = 1; |
if (whdr && ioctl(eth, BIOCSHDRCMPLT, &n) == -1) { |
if (whdr && ioctl(eth, BIOCSHDRCMPLT, &n) == -1) { |
LOGERR; |
LOGERR; |
Line 224 io_etherOpen(const char *csIface, int flags, u_int whd
|
Line 233 io_etherOpen(const char *csIface, int flags, u_int whd
|
close(eth); |
close(eth); |
return -1; |
return -1; |
} |
} |
|
#else |
|
memset(&ifr, 0, sizeof ifr); |
|
strlcpy(ifr.ifr_name, szStr, sizeof ifr.ifr_name); |
|
if (ioctl(eth, SIOCGIFINDEX, &ifr)) { |
|
LOGERR; |
|
close(eth); |
|
return -1; |
|
} |
|
|
|
sa.sll.sll_family = AF_PACKET; |
|
sa.sll.sll_ifindex = ifr.ifr_ifindex; |
|
sa.sll.sll_protocol = htons((u_short) wdlt); |
|
if (bind(eth, &sa.sa, sizeof(sa.sll)) == -1) { |
|
LOGERR; |
|
close(eth); |
|
return -1; |
|
} |
|
#endif |
|
|
return eth; |
return eth; |
} |
} |
|
|
Line 311 ssize_t
|
Line 338 ssize_t
|
io_etherRecv(int eth, void * __restrict buf, size_t buflen, void * __restrict zcbuf) |
io_etherRecv(int eth, void * __restrict buf, size_t buflen, void * __restrict zcbuf) |
{ |
{ |
ssize_t rlen = 0; |
ssize_t rlen = 0; |
|
#ifndef __linux__ |
struct bpf_hdr *h; |
struct bpf_hdr *h; |
|
#endif |
|
|
if (!buf || !buflen) { |
if (!buf || !buflen) { |
io_SetErr(EINVAL, "invalid arguments"); |
io_SetErr(EINVAL, "invalid arguments"); |
Line 335 io_etherRecv(int eth, void * __restrict buf, size_t bu
|
Line 364 io_etherRecv(int eth, void * __restrict buf, size_t bu
|
#endif |
#endif |
} |
} |
|
|
|
#ifndef __linux__ |
h = (struct bpf_hdr*) buf; |
h = (struct bpf_hdr*) buf; |
rlen -= h->bh_hdrlen; |
rlen -= h->bh_hdrlen; |
|
|
Line 349 io_etherRecv(int eth, void * __restrict buf, size_t bu
|
Line 379 io_etherRecv(int eth, void * __restrict buf, size_t bu
|
} |
} |
|
|
memmove(buf, buf + h->bh_hdrlen, rlen); |
memmove(buf, buf + h->bh_hdrlen, rlen); |
|
#endif |
return rlen; |
return rlen; |
} |
} |
|
|
|
#ifndef __linux__ |
/* |
/* |
* io_etherFilter() - BPF filter routine |
* io_etherFilter() - BPF filter routine |
* |
* |
Line 398 io_etherFilter(int eth, int io, struct bpf_insn * __re
|
Line 430 io_etherFilter(int eth, int io, struct bpf_insn * __re
|
LOGERR; |
LOGERR; |
return ret; |
return ret; |
} |
} |
|
#endif |