mirror of
https://github.com/systemd/systemd
synced 2025-09-22 05:14:44 +02:00
Compare commits
No commits in common. "bf2334c054da106c6cf5290a9c9dd1281f48b0e2" and "e06d7d0fb0f1851e2464e2497c8c634fc34537c3" have entirely different histories.
bf2334c054
...
e06d7d0fb0
@ -612,20 +612,6 @@
|
|||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
|
||||||
<term><varname>ReceiveChecksumOffload=</varname></term>
|
|
||||||
<listitem>
|
|
||||||
<para>Takes a boolean. If set to true, the hardware offload for checksumming of ingress
|
|
||||||
network packets is enabled. When unset, the kernel's default will be used.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
|
||||||
<term><varname>TransmitChecksumOffload=</varname></term>
|
|
||||||
<listitem>
|
|
||||||
<para>Takes a boolean. If set to true, the hardware offload for checksumming of egress
|
|
||||||
network packets is enabled. When unset, the kernel's default will be used.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>TCPSegmentationOffload=</varname></term>
|
<term><varname>TCPSegmentationOffload=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
|
@ -1071,7 +1071,7 @@
|
|||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term><varname>InvertRule=</varname></term>
|
<term><varname>InvertRule=</varname></term>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>A boolean. Specifies whether the rule is to be inverted. Defaults to false.</para>
|
<para>A boolean. Specifies whether the rule to be inverted. Defaults to false.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
@ -1091,14 +1091,6 @@
|
|||||||
unset.</para>
|
unset.</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
<varlistentry>
|
|
||||||
<term><varname>SuppressPrefixLength=</varname></term>
|
|
||||||
<listitem>
|
|
||||||
<para>Takes a number <replaceable>N</replaceable> in the range 0-128 and rejects routing
|
|
||||||
decisions that have a prefix length of <replaceable>N</replaceable> or less. Defaults to
|
|
||||||
unset.</para>
|
|
||||||
</listitem>
|
|
||||||
</varlistentry>
|
|
||||||
</variablelist>
|
</variablelist>
|
||||||
</refsect1>
|
</refsect1>
|
||||||
|
|
||||||
|
@ -698,22 +698,6 @@ int parse_ip_port_range(const char *s, uint16_t *low, uint16_t *high) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int parse_ip_prefix_length(const char *s, int *ret) {
|
|
||||||
unsigned l;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
r = safe_atou(s, &l);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
if (l > 128)
|
|
||||||
return -ERANGE;
|
|
||||||
|
|
||||||
*ret = (int) l;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int parse_dev(const char *s, dev_t *ret) {
|
int parse_dev(const char *s, dev_t *ret) {
|
||||||
const char *major;
|
const char *major;
|
||||||
unsigned x, y;
|
unsigned x, y;
|
||||||
|
@ -112,6 +112,4 @@ int parse_nice(const char *p, int *ret);
|
|||||||
int parse_ip_port(const char *s, uint16_t *ret);
|
int parse_ip_port(const char *s, uint16_t *ret);
|
||||||
int parse_ip_port_range(const char *s, uint16_t *low, uint16_t *high);
|
int parse_ip_port_range(const char *s, uint16_t *low, uint16_t *high);
|
||||||
|
|
||||||
int parse_ip_prefix_length(const char *s, int *ret);
|
|
||||||
|
|
||||||
int parse_oom_score_adjust(const char *s, int *ret);
|
int parse_oom_score_adjust(const char *s, int *ret);
|
||||||
|
@ -962,7 +962,6 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, voi
|
|||||||
_cleanup_free_ char *from = NULL, *to = NULL;
|
_cleanup_free_ char *from = NULL, *to = NULL;
|
||||||
RoutingPolicyRule *rule = NULL;
|
RoutingPolicyRule *rule = NULL;
|
||||||
const char *iif = NULL, *oif = NULL;
|
const char *iif = NULL, *oif = NULL;
|
||||||
uint32_t suppress_prefixlen;
|
|
||||||
Manager *m = userdata;
|
Manager *m = userdata;
|
||||||
unsigned flags;
|
unsigned flags;
|
||||||
uint16_t type;
|
uint16_t type;
|
||||||
@ -1145,14 +1144,6 @@ int manager_rtnl_process_rule(sd_netlink *rtnl, sd_netlink_message *message, voi
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = sd_netlink_message_read_u32(message, FRA_SUPPRESS_PREFIXLEN, &suppress_prefixlen);
|
|
||||||
if (r < 0 && r != -ENODATA) {
|
|
||||||
log_warning_errno(r, "rtnl: could not get FRA_SUPPRESS_PREFIXLEN attribute, ignoring: %m");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (r >= 0)
|
|
||||||
tmp->suppress_prefixlen = (int) suppress_prefixlen;
|
|
||||||
|
|
||||||
(void) routing_policy_rule_get(m, tmp, &rule);
|
(void) routing_policy_rule_get(m, tmp, &rule);
|
||||||
|
|
||||||
if (DEBUG_LOGGING) {
|
if (DEBUG_LOGGING) {
|
||||||
|
@ -131,7 +131,6 @@ RoutingPolicyRule.DestinationPort, config_parse_routing_policy_rule_port_ra
|
|||||||
RoutingPolicyRule.InvertRule, config_parse_routing_policy_rule_invert, 0, 0
|
RoutingPolicyRule.InvertRule, config_parse_routing_policy_rule_invert, 0, 0
|
||||||
RoutingPolicyRule.Family, config_parse_routing_policy_rule_family, 0, 0
|
RoutingPolicyRule.Family, config_parse_routing_policy_rule_family, 0, 0
|
||||||
RoutingPolicyRule.User, config_parse_routing_policy_rule_uid_range, 0, 0
|
RoutingPolicyRule.User, config_parse_routing_policy_rule_uid_range, 0, 0
|
||||||
RoutingPolicyRule.SuppressPrefixLength, config_parse_routing_policy_rule_suppress_prefixlen, 0, 0
|
|
||||||
Route.Gateway, config_parse_gateway, 0, 0
|
Route.Gateway, config_parse_gateway, 0, 0
|
||||||
Route.Destination, config_parse_destination, 0, 0
|
Route.Destination, config_parse_destination, 0, 0
|
||||||
Route.Source, config_parse_destination, 0, 0
|
Route.Source, config_parse_destination, 0, 0
|
||||||
|
@ -30,7 +30,6 @@ int routing_policy_rule_new(RoutingPolicyRule **ret) {
|
|||||||
.table = RT_TABLE_MAIN,
|
.table = RT_TABLE_MAIN,
|
||||||
.uid_range.start = UID_INVALID,
|
.uid_range.start = UID_INVALID,
|
||||||
.uid_range.end = UID_INVALID,
|
.uid_range.end = UID_INVALID,
|
||||||
.suppress_prefixlen = -1,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
*ret = rule;
|
*ret = rule;
|
||||||
@ -99,7 +98,6 @@ static int routing_policy_rule_copy(RoutingPolicyRule *dest, RoutingPolicyRule *
|
|||||||
dest->sport = src->sport;
|
dest->sport = src->sport;
|
||||||
dest->dport = src->dport;
|
dest->dport = src->dport;
|
||||||
dest->uid_range = src->uid_range;
|
dest->uid_range = src->uid_range;
|
||||||
dest->suppress_prefixlen = src->suppress_prefixlen;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -125,7 +123,6 @@ static void routing_policy_rule_hash_func(const RoutingPolicyRule *rule, struct
|
|||||||
siphash24_compress(&rule->fwmask, sizeof(rule->fwmask), state);
|
siphash24_compress(&rule->fwmask, sizeof(rule->fwmask), state);
|
||||||
siphash24_compress(&rule->priority, sizeof(rule->priority), state);
|
siphash24_compress(&rule->priority, sizeof(rule->priority), state);
|
||||||
siphash24_compress(&rule->table, sizeof(rule->table), state);
|
siphash24_compress(&rule->table, sizeof(rule->table), state);
|
||||||
siphash24_compress(&rule->suppress_prefixlen, sizeof(rule->suppress_prefixlen), state);
|
|
||||||
|
|
||||||
siphash24_compress(&rule->protocol, sizeof(rule->protocol), state);
|
siphash24_compress(&rule->protocol, sizeof(rule->protocol), state);
|
||||||
siphash24_compress(&rule->sport, sizeof(rule->sport), state);
|
siphash24_compress(&rule->sport, sizeof(rule->sport), state);
|
||||||
@ -195,10 +192,6 @@ static int routing_policy_rule_compare_func(const RoutingPolicyRule *a, const Ro
|
|||||||
if (r != 0)
|
if (r != 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
r = CMP(a->suppress_prefixlen, b->suppress_prefixlen);
|
|
||||||
if (r != 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = CMP(a->protocol, b->protocol);
|
r = CMP(a->protocol, b->protocol);
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
return r;
|
return r;
|
||||||
@ -583,12 +576,6 @@ int routing_policy_rule_configure(RoutingPolicyRule *rule, Link *link, link_netl
|
|||||||
return log_link_error_errno(link, r, "Could not append FIB_RULE_INVERT attribute: %m");
|
return log_link_error_errno(link, r, "Could not append FIB_RULE_INVERT attribute: %m");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rule->suppress_prefixlen >= 0) {
|
|
||||||
r = sd_netlink_message_append_u32(m, FRA_SUPPRESS_PREFIXLEN, (uint32_t) rule->suppress_prefixlen);
|
|
||||||
if (r < 0)
|
|
||||||
return log_link_error_errno(link, r, "Could not append FRA_SUPPRESS_PREFIXLEN attribute: %m");
|
|
||||||
}
|
|
||||||
|
|
||||||
rule->link = link;
|
rule->link = link;
|
||||||
|
|
||||||
r = netlink_call_async(link->manager->rtnl, NULL, m,
|
r = netlink_call_async(link->manager->rtnl, NULL, m,
|
||||||
@ -1127,48 +1114,6 @@ int config_parse_routing_policy_rule_uid_range(
|
|||||||
n->uid_range.start = start;
|
n->uid_range.start = start;
|
||||||
n->uid_range.end = end;
|
n->uid_range.end = end;
|
||||||
n = NULL;
|
n = NULL;
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int config_parse_routing_policy_rule_suppress_prefixlen(
|
|
||||||
const char *unit,
|
|
||||||
const char *filename,
|
|
||||||
unsigned line,
|
|
||||||
const char *section,
|
|
||||||
unsigned section_line,
|
|
||||||
const char *lvalue,
|
|
||||||
int ltype,
|
|
||||||
const char *rvalue,
|
|
||||||
void *data,
|
|
||||||
void *userdata) {
|
|
||||||
|
|
||||||
_cleanup_(routing_policy_rule_free_or_set_invalidp) RoutingPolicyRule *n = NULL;
|
|
||||||
Network *network = userdata;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
assert(filename);
|
|
||||||
assert(section);
|
|
||||||
assert(lvalue);
|
|
||||||
assert(rvalue);
|
|
||||||
assert(data);
|
|
||||||
|
|
||||||
r = routing_policy_rule_new_static(network, filename, section_line, &n);
|
|
||||||
if (r < 0)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
r = parse_ip_prefix_length(rvalue, &n->suppress_prefixlen);
|
|
||||||
if (r == -ERANGE) {
|
|
||||||
log_syntax(unit, LOG_ERR, filename, line, r, "Prefix length outside of valid range 0-128, ignoring: %s", rvalue);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (r < 0) {
|
|
||||||
log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse RPDB rule suppress_prefixlen, ignoring: %s", rvalue);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
n = NULL;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1294,13 +1239,6 @@ int routing_policy_serialize_rules(Set *rules, FILE *f) {
|
|||||||
space = true;
|
space = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rule->suppress_prefixlen >= 0) {
|
|
||||||
fprintf(f, "%ssuppress_prefixlen=%d",
|
|
||||||
space ? " " : "",
|
|
||||||
rule->suppress_prefixlen);
|
|
||||||
space = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(f, "%stable=%"PRIu32 "\n",
|
fprintf(f, "%stable=%"PRIu32 "\n",
|
||||||
space ? " " : "",
|
space ? " " : "",
|
||||||
rule->table);
|
rule->table);
|
||||||
@ -1400,12 +1338,14 @@ int routing_policy_load_rules(const char *state_file, Set **rules) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if (streq(a, "fwmark")) {
|
} else if (streq(a, "fwmark")) {
|
||||||
|
|
||||||
r = parse_fwmark_fwmask(b, &rule->fwmark, &rule->fwmask);
|
r = parse_fwmark_fwmask(b, &rule->fwmark, &rule->fwmask);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
log_error_errno(r, "Failed to parse RPDB rule firewall mark or mask, ignoring: %s", a);
|
log_error_errno(r, "Failed to parse RPDB rule firewall mark or mask, ignoring: %s", a);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if (streq(a, "iif")) {
|
} else if (streq(a, "iif")) {
|
||||||
|
|
||||||
if (free_and_strdup(&rule->iif, b) < 0)
|
if (free_and_strdup(&rule->iif, b) < 0)
|
||||||
return log_oom();
|
return log_oom();
|
||||||
|
|
||||||
@ -1420,6 +1360,7 @@ int routing_policy_load_rules(const char *state_file, Set **rules) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else if (streq(a, "sourceport")) {
|
} else if (streq(a, "sourceport")) {
|
||||||
|
|
||||||
r = parse_ip_port_range(b, &low, &high);
|
r = parse_ip_port_range(b, &low, &high);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
log_error_errno(r, "Invalid routing policy rule source port range, ignoring assignment: '%s'", b);
|
log_error_errno(r, "Invalid routing policy rule source port range, ignoring assignment: '%s'", b);
|
||||||
@ -1428,7 +1369,9 @@ int routing_policy_load_rules(const char *state_file, Set **rules) {
|
|||||||
|
|
||||||
rule->sport.start = low;
|
rule->sport.start = low;
|
||||||
rule->sport.end = high;
|
rule->sport.end = high;
|
||||||
|
|
||||||
} else if (streq(a, "destinationport")) {
|
} else if (streq(a, "destinationport")) {
|
||||||
|
|
||||||
r = parse_ip_port_range(b, &low, &high);
|
r = parse_ip_port_range(b, &low, &high);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
log_error_errno(r, "Invalid routing policy rule destination port range, ignoring assignment: '%s'", b);
|
log_error_errno(r, "Invalid routing policy rule destination port range, ignoring assignment: '%s'", b);
|
||||||
@ -1437,6 +1380,7 @@ int routing_policy_load_rules(const char *state_file, Set **rules) {
|
|||||||
|
|
||||||
rule->dport.start = low;
|
rule->dport.start = low;
|
||||||
rule->dport.end = high;
|
rule->dport.end = high;
|
||||||
|
|
||||||
} else if (streq(a, "uidrange")) {
|
} else if (streq(a, "uidrange")) {
|
||||||
uid_t lower, upper;
|
uid_t lower, upper;
|
||||||
|
|
||||||
@ -1448,16 +1392,6 @@ int routing_policy_load_rules(const char *state_file, Set **rules) {
|
|||||||
|
|
||||||
rule->uid_range.start = lower;
|
rule->uid_range.start = lower;
|
||||||
rule->uid_range.end = upper;
|
rule->uid_range.end = upper;
|
||||||
} else if (streq(a, "suppress_prefixlen")) {
|
|
||||||
r = parse_ip_prefix_length(b, &rule->suppress_prefixlen);
|
|
||||||
if (r == -ERANGE) {
|
|
||||||
log_error_errno(r, "Prefix length outside of valid range 0-128, ignoring: %s", b);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (r < 0) {
|
|
||||||
log_error_errno(r, "Failed to parse RPDB rule suppress_prefixlen, ignoring: %s", b);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,8 +51,6 @@ struct RoutingPolicyRule {
|
|||||||
struct fib_rule_port_range dport;
|
struct fib_rule_port_range dport;
|
||||||
struct fib_rule_uid_range uid_range;
|
struct fib_rule_uid_range uid_range;
|
||||||
|
|
||||||
int suppress_prefixlen;
|
|
||||||
|
|
||||||
LIST_FIELDS(RoutingPolicyRule, rules);
|
LIST_FIELDS(RoutingPolicyRule, rules);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -83,4 +81,3 @@ CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_ip_protocol);
|
|||||||
CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_invert);
|
CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_invert);
|
||||||
CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_family);
|
CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_family);
|
||||||
CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_uid_range);
|
CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_uid_range);
|
||||||
CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_suppress_prefixlen);
|
|
||||||
|
@ -50,8 +50,6 @@ DEFINE_STRING_TABLE_LOOKUP(port, NetDevPort);
|
|||||||
DEFINE_CONFIG_PARSE_ENUM(config_parse_port, port, NetDevPort, "Failed to parse Port setting");
|
DEFINE_CONFIG_PARSE_ENUM(config_parse_port, port, NetDevPort, "Failed to parse Port setting");
|
||||||
|
|
||||||
static const char* const netdev_feature_table[_NET_DEV_FEAT_MAX] = {
|
static const char* const netdev_feature_table[_NET_DEV_FEAT_MAX] = {
|
||||||
[NET_DEV_FEAT_RX] = "rx-checksum",
|
|
||||||
[NET_DEV_FEAT_TX] = "tx-checksum-", /* The suffix "-" means any feature beginning with "tx-checksum-" */
|
|
||||||
[NET_DEV_FEAT_GSO] = "tx-generic-segmentation",
|
[NET_DEV_FEAT_GSO] = "tx-generic-segmentation",
|
||||||
[NET_DEV_FEAT_GRO] = "rx-gro",
|
[NET_DEV_FEAT_GRO] = "rx-gro",
|
||||||
[NET_DEV_FEAT_LRO] = "rx-lro",
|
[NET_DEV_FEAT_LRO] = "rx-lro",
|
||||||
@ -500,38 +498,22 @@ static int get_stringset(int ethtool_fd, struct ifreq *ifr, int stringset_id, st
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_features_bit(
|
static int find_feature_index(struct ethtool_gstrings *strings, const char *feature) {
|
||||||
const struct ethtool_gstrings *strings,
|
unsigned i;
|
||||||
const char *feature,
|
|
||||||
bool flag,
|
|
||||||
struct ethtool_sfeatures *sfeatures) {
|
|
||||||
bool found = false;
|
|
||||||
|
|
||||||
assert(strings);
|
for (i = 0; i < strings->len; i++) {
|
||||||
assert(feature);
|
if (streq((char *) &strings->data[i * ETH_GSTRING_LEN], feature))
|
||||||
assert(sfeatures);
|
return i;
|
||||||
|
|
||||||
for (size_t i = 0; i < strings->len; i++)
|
|
||||||
if (streq((char *) &strings->data[i * ETH_GSTRING_LEN], feature) ||
|
|
||||||
(endswith(feature, "-") && startswith((char *) &strings->data[i * ETH_GSTRING_LEN], feature))) {
|
|
||||||
size_t block, bit;
|
|
||||||
|
|
||||||
block = i / 32;
|
|
||||||
bit = i % 32;
|
|
||||||
|
|
||||||
sfeatures->features[block].valid |= 1 << bit;
|
|
||||||
SET_FLAG(sfeatures->features[block].requested, 1 << bit, flag);
|
|
||||||
found = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return found ? 0 : -ENODATA;
|
return -ENODATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ethtool_set_features(int *ethtool_fd, const char *ifname, int *features) {
|
int ethtool_set_features(int *ethtool_fd, const char *ifname, int *features) {
|
||||||
_cleanup_free_ struct ethtool_gstrings *strings = NULL;
|
_cleanup_free_ struct ethtool_gstrings *strings = NULL;
|
||||||
struct ethtool_sfeatures *sfeatures;
|
struct ethtool_sfeatures *sfeatures;
|
||||||
|
int block, bit, i, r;
|
||||||
struct ifreq ifr = {};
|
struct ifreq ifr = {};
|
||||||
int i, r;
|
|
||||||
|
|
||||||
if (*ethtool_fd < 0) {
|
if (*ethtool_fd < 0) {
|
||||||
r = ethtool_connect_or_warn(ethtool_fd, true);
|
r = ethtool_connect_or_warn(ethtool_fd, true);
|
||||||
@ -549,13 +531,26 @@ int ethtool_set_features(int *ethtool_fd, const char *ifname, int *features) {
|
|||||||
sfeatures->cmd = ETHTOOL_SFEATURES;
|
sfeatures->cmd = ETHTOOL_SFEATURES;
|
||||||
sfeatures->size = DIV_ROUND_UP(strings->len, 32U);
|
sfeatures->size = DIV_ROUND_UP(strings->len, 32U);
|
||||||
|
|
||||||
for (i = 0; i < _NET_DEV_FEAT_MAX; i++)
|
for (i = 0; i < _NET_DEV_FEAT_MAX; i++) {
|
||||||
|
|
||||||
if (features[i] != -1) {
|
if (features[i] != -1) {
|
||||||
r = set_features_bit(strings, netdev_feature_table[i], features[i], sfeatures);
|
|
||||||
|
r = find_feature_index(strings, netdev_feature_table[i]);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
log_warning_errno(r, "ethtool: could not find feature, ignoring: %s", netdev_feature_table[i]);
|
log_warning_errno(r, "ethtool: could not find feature: %s", netdev_feature_table[i]);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
block = r / 32;
|
||||||
|
bit = r % 32;
|
||||||
|
|
||||||
|
sfeatures->features[block].valid |= 1 << bit;
|
||||||
|
|
||||||
|
if (features[i])
|
||||||
|
sfeatures->features[block].requested |= 1 << bit;
|
||||||
|
else
|
||||||
|
sfeatures->features[block].requested &= ~(1 << bit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ifr.ifr_data = (void *) sfeatures;
|
ifr.ifr_data = (void *) sfeatures;
|
||||||
|
@ -32,8 +32,6 @@ typedef enum WakeOnLan {
|
|||||||
} WakeOnLan;
|
} WakeOnLan;
|
||||||
|
|
||||||
typedef enum NetDevFeature {
|
typedef enum NetDevFeature {
|
||||||
NET_DEV_FEAT_RX,
|
|
||||||
NET_DEV_FEAT_TX,
|
|
||||||
NET_DEV_FEAT_GSO,
|
NET_DEV_FEAT_GSO,
|
||||||
NET_DEV_FEAT_GRO,
|
NET_DEV_FEAT_GRO,
|
||||||
NET_DEV_FEAT_LRO,
|
NET_DEV_FEAT_LRO,
|
||||||
|
@ -45,8 +45,6 @@ Link.Duplex, config_parse_duplex, 0,
|
|||||||
Link.AutoNegotiation, config_parse_tristate, 0, offsetof(link_config, autonegotiation)
|
Link.AutoNegotiation, config_parse_tristate, 0, offsetof(link_config, autonegotiation)
|
||||||
Link.WakeOnLan, config_parse_wol, 0, offsetof(link_config, wol)
|
Link.WakeOnLan, config_parse_wol, 0, offsetof(link_config, wol)
|
||||||
Link.Port, config_parse_port, 0, offsetof(link_config, port)
|
Link.Port, config_parse_port, 0, offsetof(link_config, port)
|
||||||
Link.ReceiveChecksumOffload, config_parse_tristate, 0, offsetof(link_config, features[NET_DEV_FEAT_RX])
|
|
||||||
Link.TransmitChecksumOffload, config_parse_tristate, 0, offsetof(link_config, features[NET_DEV_FEAT_TX])
|
|
||||||
Link.GenericSegmentationOffload, config_parse_tristate, 0, offsetof(link_config, features[NET_DEV_FEAT_GSO])
|
Link.GenericSegmentationOffload, config_parse_tristate, 0, offsetof(link_config, features[NET_DEV_FEAT_GSO])
|
||||||
Link.TCPSegmentationOffload, config_parse_tristate, 0, offsetof(link_config, features[NET_DEV_FEAT_TSO])
|
Link.TCPSegmentationOffload, config_parse_tristate, 0, offsetof(link_config, features[NET_DEV_FEAT_TSO])
|
||||||
Link.TCP6SegmentationOffload, config_parse_tristate, 0, offsetof(link_config, features[NET_DEV_FEAT_TSO6])
|
Link.TCP6SegmentationOffload, config_parse_tristate, 0, offsetof(link_config, features[NET_DEV_FEAT_TSO6])
|
||||||
|
@ -26,8 +26,6 @@ Duplex=
|
|||||||
AutoNegotiation=
|
AutoNegotiation=
|
||||||
WakeOnLan=
|
WakeOnLan=
|
||||||
Port=
|
Port=
|
||||||
ReceiveChecksumOffload=
|
|
||||||
TransmitChecksumOffload=
|
|
||||||
GenericSegmentationOffload=
|
GenericSegmentationOffload=
|
||||||
TCPSegmentationOffload=
|
TCPSegmentationOffload=
|
||||||
TCP6SegmentationOffload=
|
TCP6SegmentationOffload=
|
||||||
|
@ -225,7 +225,6 @@ DestinationPort=
|
|||||||
IPProtocol=
|
IPProtocol=
|
||||||
InvertRule=
|
InvertRule=
|
||||||
Family=
|
Family=
|
||||||
SuppressPrefixLength=
|
|
||||||
User=
|
User=
|
||||||
[IPv6PrefixDelegation]
|
[IPv6PrefixDelegation]
|
||||||
RouterPreference=
|
RouterPreference=
|
||||||
|
@ -538,7 +538,6 @@ STP=
|
|||||||
Scope=
|
Scope=
|
||||||
SendHostname=
|
SendHostname=
|
||||||
Source=
|
Source=
|
||||||
SuppressPrefixLength=
|
|
||||||
TCP6SegmentationOffload=
|
TCP6SegmentationOffload=
|
||||||
TCPSegmentationOffload=
|
TCPSegmentationOffload=
|
||||||
TOS=
|
TOS=
|
||||||
|
Loading…
x
Reference in New Issue
Block a user