mirror of
https://github.com/Dasharo/systemd.git
synced 2026-03-06 15:02:31 -08:00
network: re-implement parse_vid_range()
This commit is contained in:
@@ -204,49 +204,6 @@ int br_vlan_configure(Link *link, uint16_t pvid, uint32_t *br_vid_bitmap, uint32
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int parse_vid_range(const char *rvalue, uint16_t *vid, uint16_t *vid_end) {
|
||||
int r;
|
||||
char *p;
|
||||
char *_rvalue = NULL;
|
||||
uint16_t _vid = UINT16_MAX;
|
||||
uint16_t _vid_end = UINT16_MAX;
|
||||
|
||||
assert(rvalue);
|
||||
assert(vid);
|
||||
assert(vid_end);
|
||||
|
||||
_rvalue = strdupa(rvalue);
|
||||
p = strchr(_rvalue, '-');
|
||||
if (p) {
|
||||
*p = '\0';
|
||||
p++;
|
||||
r = parse_vlanid(_rvalue, &_vid);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (_vid == 0)
|
||||
return -ERANGE;
|
||||
|
||||
r = parse_vlanid(p, &_vid_end);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (_vid_end == 0)
|
||||
return -ERANGE;
|
||||
} else {
|
||||
r = parse_vlanid(_rvalue, &_vid);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (_vid == 0)
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
*vid = _vid;
|
||||
*vid_end = _vid_end;
|
||||
return r;
|
||||
}
|
||||
|
||||
int config_parse_brvlan_pvid(const char *unit, const char *filename,
|
||||
unsigned line, const char *section,
|
||||
unsigned section_line, const char *lvalue,
|
||||
@@ -287,16 +244,9 @@ int config_parse_brvlan_vlan(const char *unit, const char *filename,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (UINT16_MAX == vid_end)
|
||||
set_bit(vid++, network->br_vid_bitmap);
|
||||
else {
|
||||
if (vid >= vid_end) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid VLAN range, ignoring %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
for (; vid <= vid_end; vid++)
|
||||
set_bit(vid, network->br_vid_bitmap);
|
||||
}
|
||||
for (; vid <= vid_end; vid++)
|
||||
set_bit(vid, network->br_vid_bitmap);
|
||||
|
||||
network->use_br_vlan = true;
|
||||
return 0;
|
||||
}
|
||||
@@ -322,19 +272,11 @@ int config_parse_brvlan_untagged(const char *unit, const char *filename,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (UINT16_MAX == vid_end) {
|
||||
for (; vid <= vid_end; vid++) {
|
||||
set_bit(vid, network->br_vid_bitmap);
|
||||
set_bit(vid, network->br_untagged_bitmap);
|
||||
} else {
|
||||
if (vid >= vid_end) {
|
||||
log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid VLAN range, ignoring %s", rvalue);
|
||||
return 0;
|
||||
}
|
||||
for (; vid <= vid_end; vid++) {
|
||||
set_bit(vid, network->br_vid_bitmap);
|
||||
set_bit(vid, network->br_untagged_bitmap);
|
||||
}
|
||||
}
|
||||
|
||||
network->use_br_vlan = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -22,6 +22,22 @@ int parse_vlanid(const char *p, uint16_t *ret) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int parse_vid_range(const char *p, uint16_t *vid, uint16_t *vid_end) {
|
||||
unsigned lower, upper;
|
||||
int r;
|
||||
|
||||
r = parse_range(p, &lower, &upper);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (lower > VLANID_MAX || upper > VLANID_MAX || lower > upper)
|
||||
return -EINVAL;
|
||||
|
||||
*vid = lower;
|
||||
*vid_end = upper;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_default_port_vlanid(
|
||||
const char *unit,
|
||||
const char *filename,
|
||||
|
||||
@@ -15,6 +15,7 @@ static inline bool vlanid_is_valid(uint16_t id) {
|
||||
}
|
||||
|
||||
int parse_vlanid(const char *p, uint16_t *ret);
|
||||
int parse_vid_range(const char *p, uint16_t *vid, uint16_t *vid_end);
|
||||
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_default_port_vlanid);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_vlanid);
|
||||
|
||||
Reference in New Issue
Block a user