diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-07-05 05:37:25 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2019-07-05 16:35:06 +0900 |
commit | fb721f084c8e013dc696d92aa7aa74f5ac606a9b (patch) | |
tree | a9a835a3d06ad60ae3515b8526284e82100c2d07 | |
parent | 7bbb43a79a2c1e7e5c520ada83a4db0f7c16ee52 (diff) | |
download | systemd-fb721f084c8e013dc696d92aa7aa74f5ac606a9b.tar.gz |
network: re-implement parse_vid_range()
-rw-r--r-- | src/network/networkd-brvlan.c | 68 | ||||
-rw-r--r-- | src/shared/vlan-util.c | 16 | ||||
-rw-r--r-- | src/shared/vlan-util.h | 1 |
3 files changed, 22 insertions, 63 deletions
diff --git a/src/network/networkd-brvlan.c b/src/network/networkd-brvlan.c index 41009de737..f7fa84e293 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 2f9df7dd1b..a4b42df85b 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 ebe4331ed4..c55adee3c0 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); |