Line data Source code
1 : /* SPDX-License-Identifier: LGPL-2.1+ */
2 :
3 : #include "conf-parser.h"
4 : #include "parse-util.h"
5 : #include "string-util.h"
6 : #include "vlan-util.h"
7 :
8 0 : int parse_vlanid(const char *p, uint16_t *ret) {
9 : uint16_t id;
10 : int r;
11 :
12 0 : assert(p);
13 0 : assert(ret);
14 :
15 0 : r = safe_atou16(p, &id);
16 0 : if (r < 0)
17 0 : return r;
18 0 : if (!vlanid_is_valid(id))
19 0 : return -ERANGE;
20 :
21 0 : *ret = id;
22 0 : return 0;
23 : }
24 :
25 0 : int parse_vid_range(const char *p, uint16_t *vid, uint16_t *vid_end) {
26 : unsigned lower, upper;
27 : int r;
28 :
29 0 : r = parse_range(p, &lower, &upper);
30 0 : if (r < 0)
31 0 : return r;
32 :
33 0 : if (lower > VLANID_MAX || upper > VLANID_MAX || lower > upper)
34 0 : return -EINVAL;
35 :
36 0 : *vid = lower;
37 0 : *vid_end = upper;
38 0 : return 0;
39 : }
40 :
41 0 : int config_parse_default_port_vlanid(
42 : const char *unit,
43 : const char *filename,
44 : unsigned line,
45 : const char *section,
46 : unsigned section_line,
47 : const char *lvalue,
48 : int ltype,
49 : const char *rvalue,
50 : void *data,
51 : void *userdata) {
52 0 : uint16_t *id = data;
53 :
54 0 : assert(lvalue);
55 0 : assert(rvalue);
56 0 : assert(data);
57 :
58 0 : if (streq(rvalue, "none")) {
59 0 : *id = 0;
60 0 : return 0;
61 : }
62 :
63 0 : return config_parse_vlanid(unit, filename, line, section, section_line,
64 : lvalue, ltype, rvalue, data, userdata);
65 : }
66 :
67 0 : int config_parse_vlanid(
68 : const char *unit,
69 : const char *filename,
70 : unsigned line,
71 : const char *section,
72 : unsigned section_line,
73 : const char *lvalue,
74 : int ltype,
75 : const char *rvalue,
76 : void *data,
77 : void *userdata) {
78 :
79 0 : uint16_t *id = data;
80 : int r;
81 :
82 0 : assert(filename);
83 0 : assert(lvalue);
84 0 : assert(rvalue);
85 0 : assert(data);
86 :
87 0 : r = parse_vlanid(rvalue, id);
88 0 : if (r == -ERANGE) {
89 0 : log_syntax(unit, LOG_ERR, filename, line, r, "VLAN identifier outside of valid range 0…4094, ignoring: %s", rvalue);
90 0 : return 0;
91 : }
92 0 : if (r < 0) {
93 0 : log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse VLAN identifier value, ignoring: %s", rvalue);
94 0 : return 0;
95 : }
96 :
97 0 : return 0;
98 : }
|