From: Yu Watanabe Date: Thu, 4 Jul 2019 20:37:25 +0000 (+0900) Subject: network: re-implement parse_vid_range() X-Git-Tag: v243-rc1~190^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fb721f084c8e013dc696d92aa7aa74f5ac606a9b;p=thirdparty%2Fsystemd.git network: re-implement parse_vid_range() --- diff --git a/src/network/networkd-brvlan.c b/src/network/networkd-brvlan.c index 41009de7372..f7fa84e293c 100644 --- a/src/network/networkd-brvlan.c +++ b/src/network/networkd-brvlan.c @@ -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; } diff --git a/src/shared/vlan-util.c b/src/shared/vlan-util.c index 2f9df7dd1b7..a4b42df85ba 100644 --- a/src/shared/vlan-util.c +++ b/src/shared/vlan-util.c @@ -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, diff --git a/src/shared/vlan-util.h b/src/shared/vlan-util.h index ebe4331ed4f..c55adee3c07 100644 --- a/src/shared/vlan-util.h +++ b/src/shared/vlan-util.h @@ -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);