offloading: preparation for disabling offload on BSD

Add functions for setting IFCAP flags.
pull/2266/head
Victor Julien 10 years ago
parent 30c853a304
commit 7004987670

@ -236,6 +236,33 @@ int GetIfaceCaps(const char *ifname)
return ifr.ifr_curcap;
}
#endif
#ifdef SIOCSIFCAP
int SetIfaceCaps(const char *ifname, int caps)
{
struct ifreq ifr;
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
return -1;
}
memset(&ifr, 0, sizeof(ifr));
strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
ifr.ifr_reqcap = caps;
if (ioctl(fd, SIOCSIFCAP, &ifr) == -1) {
SCLogError(SC_ERR_SYSCALL,
"Unable to set caps for iface \"%s\": %s",
ifname, strerror(errno));
close(fd);
return -1;
}
close(fd);
return 0;
}
#endif
#if defined HAVE_LINUX_ETHTOOL_H && defined SIOCETHTOOL
static int GetEthtoolValue(const char *dev, int cmd, uint32_t *value)
@ -384,6 +411,40 @@ static int GetIfaceOffloadingBSD(const char *ifname)
}
#endif
#ifdef SIOCSIFCAP
static int DisableIfaceOffloadingBSD(const char *ifname)
{
int ret = 0;
int if_caps = GetIfaceCaps(ifname);
int set_caps = if_caps;
if (if_caps == -1) {
return -1;
}
SCLogDebug("if_caps %X", if_caps);
if (if_caps & IFCAP_RXCSUM) {
SCLogInfo("%s: disabling rxcsum offloading", ifname);
set_caps &= ~IFCAP_RXCSUM;
}
#ifdef IFCAP_TOE
if (if_caps & (IFCAP_TSO|IFCAP_TOE|IFCAP_LRO)) {
SCLogInfo("%s: disabling tso|toe|lro offloading", ifname);
set_caps &= ~(IFCAP_TSO|IFCAP_LRO);
}
#else
if (if_caps & (IFCAP_TSO|IFCAP_LRO)) {
SCLogInfo("%s: disabling tso|lro offloading", ifname);
set_caps &= ~(IFCAP_TSO|IFCAP_LRO);
}
#endif
if (set_caps != if_caps) {
SetIfaceCaps(ifname, set_caps);
}
return ret;
}
#endif
/**
* \brief output offloading status of the link
*
@ -409,6 +470,16 @@ int GetIfaceOffloading(const char *dev, int csum, int other)
#endif
}
int DisableIfaceOffloading(const char *dev, int csum, int other)
{
#if defined SIOCSIFCAP
return DisableIfaceOffloadingBSD(dev);
#else
return 0;
#endif
}
int GetIfaceRSSQueuesNum(const char *pcap_dev)
{
#if defined HAVE_LINUX_ETHTOOL_H && defined ETHTOOL_GRXRINGS

@ -34,3 +34,4 @@ int SetIfaceFlags(const char *ifname, int flags);
#ifdef SIOCGIFCAP
int GetIfaceCaps(const char *ifname);
#endif
int DisableIfaceOffloading(const char *dev, int csum, int other);

Loading…
Cancel
Save