Skip to content

Commit f7bf1ab

Browse files
ssahanikeszybz
authored andcommitted
socket-util: add parse_ip_prefix (systemd#5867)
networkd: replace parse prefix with generic in_addr_prefix_from_string
1 parent 192fa38 commit f7bf1ab

File tree

4 files changed

+47
-39
lines changed

4 files changed

+47
-39
lines changed

src/basic/in-addr-util.c

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,3 +464,45 @@ int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen)
464464

465465
return -EAFNOSUPPORT;
466466
}
467+
468+
int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, uint8_t *ret_prefixlen) {
469+
union in_addr_union buffer;
470+
const char *e, *l;
471+
uint8_t k;
472+
int r;
473+
474+
assert(p);
475+
476+
if (!IN_SET(family, AF_INET, AF_INET6))
477+
return -EAFNOSUPPORT;
478+
479+
e = strchr(p, '/');
480+
if (e)
481+
l = strndupa(p, e - p);
482+
else
483+
l = p;
484+
485+
r = in_addr_from_string(family, l, &buffer);
486+
if (r < 0)
487+
return r;
488+
489+
k = FAMILY_ADDRESS_SIZE(family) * 8;
490+
491+
if (e) {
492+
uint8_t n;
493+
494+
r = safe_atou8(e + 1, &n);
495+
if (r < 0)
496+
return r;
497+
498+
if (n > k)
499+
return -ERANGE;
500+
501+
k = n;
502+
}
503+
504+
*ret_prefix = buffer;
505+
*ret_prefixlen = k;
506+
507+
return 0;
508+
}

src/basic/in-addr-util.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ struct in_addr* in_addr_prefixlen_to_netmask(struct in_addr *addr, unsigned char
6060
int in_addr_default_prefixlen(const struct in_addr *addr, unsigned char *prefixlen);
6161
int in_addr_default_subnet_mask(const struct in_addr *addr, struct in_addr *mask);
6262
int in_addr_mask(int family, union in_addr_union *addr, unsigned char prefixlen);
63+
int in_addr_prefix_from_string(const char *p, int family, union in_addr_union *ret_prefix, uint8_t *ret_prefixlen);
6364

6465
static inline size_t FAMILY_ADDRESS_SIZE(int family) {
6566
assert(family == AF_INET || family == AF_INET6);

src/network/networkd-address-label.c

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ int address_label_configure(
117117
assert(link->manager->rtnl);
118118

119119
r = sd_rtnl_message_new_addrlabel(link->manager->rtnl, &req, RTM_NEWADDRLABEL,
120-
link->ifindex, label->family);
120+
link->ifindex, AF_INET6);
121121
if (r < 0)
122122
return log_error_errno(r, "Could not allocate RTM_NEWADDR message: %m");
123123

@@ -155,9 +155,7 @@ int config_parse_address_label_prefix(const char *unit,
155155

156156
_cleanup_address_label_free_ AddressLabel *n = NULL;
157157
Network *network = userdata;
158-
const char *prefix, *e;
159-
union in_addr_union buffer;
160-
int r, f;
158+
int r;
161159

162160
assert(filename);
163161
assert(section);
@@ -169,44 +167,12 @@ int config_parse_address_label_prefix(const char *unit,
169167
if (r < 0)
170168
return r;
171169

172-
/* AddressLabel=prefix/prefixlen */
173-
174-
/* prefixlen */
175-
e = strchr(rvalue, '/');
176-
if (e) {
177-
unsigned i;
178-
179-
r = safe_atou(e + 1, &i);
180-
if (r < 0) {
181-
log_syntax(unit, LOG_ERR, filename, line, r, "Prefix length is invalid, ignoring assignment: %s", e + 1);
182-
return 0;
183-
}
184-
185-
if (i > 128) {
186-
log_syntax(unit, LOG_ERR, filename, line, r, "Prefix length is out of range, ignoring assignment: %s", e + 1);
187-
return 0;
188-
}
189-
190-
n->prefixlen = (unsigned char) i;
191-
192-
prefix = strndupa(rvalue, e - rvalue);
193-
} else
194-
prefix = rvalue;
195-
196-
r = in_addr_from_string_auto(prefix, &f, &buffer);
170+
r = in_addr_prefix_from_string(rvalue, AF_INET6, &n->in_addr, &n->prefixlen);
197171
if (r < 0) {
198-
log_syntax(unit, LOG_ERR, filename, line, r, "Address label is invalid, ignoring assignment: %s", prefix);
199-
return 0;
200-
}
201-
202-
if (f != AF_INET6) {
203-
log_syntax(unit, LOG_ERR, filename, line, 0, "Address label family is not IPv6, ignoring assignment: %s", prefix);
172+
log_syntax(unit, LOG_ERR, filename, line, r, "Address label is invalid, ignoring assignment: %s", rvalue);
204173
return 0;
205174
}
206175

207-
n->family = f;
208-
n->in_addr = buffer;
209-
210176
n = NULL;
211177

212178
return 0;

src/network/networkd-address-label.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ struct AddressLabel {
3838
Link *link;
3939
NetworkConfigSection *section;
4040

41-
int family;
4241
unsigned char prefixlen;
4342
uint32_t label;
4443

0 commit comments

Comments
 (0)