summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2019-07-05 05:37:25 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2019-07-05 16:35:06 +0900
commitfb721f084c8e013dc696d92aa7aa74f5ac606a9b (patch)
treea9a835a3d06ad60ae3515b8526284e82100c2d07
parent7bbb43a79a2c1e7e5c520ada83a4db0f7c16ee52 (diff)
downloadsystemd-fb721f084c8e013dc696d92aa7aa74f5ac606a9b.tar.gz
network: re-implement parse_vid_range()
-rw-r--r--src/network/networkd-brvlan.c68
-rw-r--r--src/shared/vlan-util.c16
-rw-r--r--src/shared/vlan-util.h1
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);