Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set ipv4 set ipv6 changes #711

Draft
wants to merge 9 commits into
base: main
Choose a base branch
from
10 changes: 5 additions & 5 deletions src/json/network-json.c
Original file line number Diff line number Diff line change
Expand Up @@ -1157,22 +1157,22 @@ static int json_array_to_ip(const json_object *obj, const int family, const int
}
}

if (prefix > 0)
g_string_append_printf(v, "/%d", prefix);

if (family == AF_INET6) {
_auto_cleanup_ IPAddress *addr = NULL;
int r;

r = parse_ipv6(v->str, &addr);
r = parse_ip_from_str(v->str, &addr);
if (r < 0)
return r;

r = ip_to_str(AF_INET6, addr, &ip);
r = ip_to_str_prefix(AF_INET6, addr, &ip);
if (r < 0)
return r;
}

if (prefix > 0)
g_string_append_printf(v, "/%d", prefix);

if (family == AF_INET6)
*ret = steal_ptr(ip);
else {
Expand Down
119 changes: 112 additions & 7 deletions src/manager/network-config-manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -4555,7 +4555,8 @@ _public_ int ncm_link_enable_ipv6(int argc, char *argv[]) {

_public_ int ncm_link_set_ipv6(int argc, char *argv[]) {
int accept_ra = -1, dhcp = -1, use_dns = -1, lla = -1, send_release = -1;
_auto_cleanup_strv_ char **addrs = NULL, **dns = NULL;
_auto_cleanup_strv_ char **addrs = NULL, **dns = NULL, **domains = NULL;
UseDomains use_domains = _USE_DOMAINS_INVALID;
_auto_cleanup_ IfNameIndex *p = NULL;
_auto_cleanup_ Route *rt6 = NULL;
bool keep = true;
Expand All @@ -4570,7 +4571,8 @@ _public_ int ncm_link_set_ipv6(int argc, char *argv[]) {
log_warning("Failed to find device: %s", argv[i]);
return r;
}
continue;

continue;
} else if (streq_fold(argv[i], "accept-ra") || streq_fold(argv[i], "ara")) {
parse_next_arg(argv, argc, i);

Expand All @@ -4579,6 +4581,7 @@ _public_ int ncm_link_set_ipv6(int argc, char *argv[]) {
log_warning("Failed to parse accept-ra %s': %s", argv[i], strerror(-r));
return r;
}

accept_ra = r;
continue;
} else if (streq_fold(argv[i], "lla") || streq_fold(argv[i], "link-local")) {
Expand All @@ -4589,6 +4592,7 @@ _public_ int ncm_link_set_ipv6(int argc, char *argv[]) {
log_warning("Failed to parse link-local %s': %s", argv[2], strerror(-r));
return r;
}

lla = r;
continue;
} else if (streq_fold(argv[i], "dhcp")) {
Expand All @@ -4599,6 +4603,7 @@ _public_ int ncm_link_set_ipv6(int argc, char *argv[]) {
log_warning("Failed to parse dhcp: %s", argv[i]);
return -EINVAL;
}

dhcp = r;
continue;
} else if (streq_fold(argv[i], "gateway") || streq_fold(argv[i], "gw") || streq_fold(argv[i], "gw6") || streq_fold(argv[i], "g")) {
Expand Down Expand Up @@ -4657,6 +4662,7 @@ _public_ int ncm_link_set_ipv6(int argc, char *argv[]) {
log_warning("Failed to parse many addresses '%s': %s", argv[i], strerror(EINVAL));
return r;
}

continue;
} else if (streq_fold(argv[i], "dns")) {
parse_next_arg(argv, argc, i);
Expand All @@ -4668,6 +4674,38 @@ _public_ int ncm_link_set_ipv6(int argc, char *argv[]) {
return -EINVAL;
}

continue;
} else if (streq_fold(argv[i], "domains")) {
parse_next_arg(argv, argc, i);

if (strchr(argv[i], ',')) {
char **d;

d = strsplit(argv[i], ",", -1);
if (!d) {
log_warning("Failed to parse DNS Search domains '%s': %s", argv[i], strerror(EINVAL));
return -EINVAL;
}

d = strv_remove(d, "");
if (!d) {
log_warning("Failed to parse DNS Search domains '%s': %s", argv[i], strerror(EINVAL));
return -EINVAL;
}

if (!domains)
domains = d;
else {
domains = strv_merge(domains, d);
if (!domains)
return log_oom();
}
} else {
r = strv_extend(&domains, argv[i]);
if (r < 0)
return log_oom();
}

continue;
} else if (streq_fold(argv[i], "use-dns")) {
parse_next_arg(argv, argc, i);
Expand All @@ -4680,7 +4718,16 @@ _public_ int ncm_link_set_ipv6(int argc, char *argv[]) {

use_dns = r;
continue;
} else if (streq_fold(argv[i], "use-domains")) {
parse_next_arg(argv, argc, i);

use_domains = use_domains_name_to_mode(argv[i]);
if (use_domains < 0) {
log_warning("Failed to parse use-domains='%s': %s", argv[i], strerror(-r));
return -EINVAL;
}

continue;
} else if (streq_fold(argv[i], "send-release")) {
parse_next_arg(argv, argc, i);

Expand Down Expand Up @@ -4714,7 +4761,9 @@ _public_ int ncm_link_set_ipv6(int argc, char *argv[]) {
return -EINVAL;
}

r = manager_set_ipv6(p, dhcp, accept_ra, lla, addrs, rt6, dns, use_dns, send_release, keep);
dns = strv_remove_duplicates(dns);
domains = strv_remove_duplicates(domains);
r = manager_set_ipv6(p, dhcp, accept_ra, lla, addrs, rt6, dns, domains, use_dns, use_domains, send_release, keep);
if (r < 0) {
log_warning("Failed to configure IPv6 on device '%s': %s", p->ifname, strerror(-r));
return r;
Expand All @@ -4724,8 +4773,10 @@ _public_ int ncm_link_set_ipv6(int argc, char *argv[]) {
}

_public_ int ncm_link_set_ipv4(int argc, char *argv[]) {
_auto_cleanup_strv_ char **addrs = NULL, **dns = NULL, **domains = NULL;
DHCPClientIdentifier client_id = _DHCP_CLIENT_IDENTIFIER_INVALID;
int dhcp = -1, use_dns = -1, lla = -1, send_release = -1;
_auto_cleanup_strv_ char **addrs = NULL, **dns = NULL;
UseDomains use_domains = _USE_DOMAINS_INVALID;
_auto_cleanup_ IfNameIndex *p = NULL;
_auto_cleanup_ Route *rt4 = NULL;
bool keep = true;
Expand All @@ -4740,6 +4791,7 @@ _public_ int ncm_link_set_ipv4(int argc, char *argv[]) {
log_warning("Failed to find device: %s", argv[i]);
return r;
}

continue;
} else if (streq_fold(argv[i], "gateway") || streq_fold(argv[i], "gw") || streq_fold(argv[i], "gw4") || streq_fold(argv[i], "g")) {
_auto_cleanup_ IPAddress *gw = NULL;
Expand Down Expand Up @@ -4797,6 +4849,7 @@ _public_ int ncm_link_set_ipv4(int argc, char *argv[]) {
log_warning("Failed to parse many addresses '%s': %s", argv[i], strerror(EINVAL));
return r;
}

continue;
} else if (streq_fold(argv[i], "dhcp")) {
parse_next_arg(argv, argc, i);
Expand All @@ -4819,6 +4872,48 @@ _public_ int ncm_link_set_ipv4(int argc, char *argv[]) {
return -EINVAL;
}

continue;
} else if (streq_fold(argv[i], "domains")) {
parse_next_arg(argv, argc, i);

if (strchr(argv[i], ',')) {
char **d;

d = strsplit(argv[i], ",", -1);
if (!d) {
log_warning("Failed to parse DNS Search domains '%s': %s", argv[i], strerror(EINVAL));
return -EINVAL;
}

d = strv_remove(d, "");
if (!d) {
log_warning("Failed to parse DNS Search domains '%s': %s", argv[i], strerror(EINVAL));
return -EINVAL;
}

if (!domains)
domains = d;
else {
domains = strv_merge(domains, d);
if (!domains)
return log_oom();
}
} else {
r = strv_extend(&domains, argv[i]);
if (r < 0)
return log_oom();
}

continue;
} else if (streq_fold(argv[i], "cid") || streq_fold(argv[i], "client-id")) {
parse_next_arg(argv, argc, i);

client_id = dhcp_client_identifier_to_kind(argv[i]);
if (client_id == _DHCP_CLIENT_IDENTIFIER_INVALID) {
log_warning("Failed to parse DHCP4 client identifier: %s", argv[i]);
return -EINVAL;
}

continue;
} else if (streq_fold(argv[i], "use-dns")) {
parse_next_arg(argv, argc, i);
Expand All @@ -4831,7 +4926,16 @@ _public_ int ncm_link_set_ipv4(int argc, char *argv[]) {

use_dns = r;
continue;
} else if (streq_fold(argv[i], "use-domains")) {
parse_next_arg(argv, argc, i);

use_domains = use_domains_name_to_mode(argv[i]);
if (use_domains < 0) {
log_warning("Failed to parse use-domains='%s': %s", argv[i], strerror(-r));
return -EINVAL;
}

continue;
} else if (streq_fold(argv[i], "send-release")) {
parse_next_arg(argv, argc, i);

Expand All @@ -4842,9 +4946,7 @@ _public_ int ncm_link_set_ipv4(int argc, char *argv[]) {
}

send_release = r;

continue;

} else if (streq_fold(argv[i], "lla") || streq_fold(argv[i], "link-local")) {
parse_next_arg(argv, argc, i);

Expand All @@ -4853,6 +4955,7 @@ _public_ int ncm_link_set_ipv4(int argc, char *argv[]) {
log_warning("Failed to parse link-local %s': %s", argv[2], strerror(-r));
return r;
}

lla = r;
continue;
} else if (streq_fold(argv[i], "keep")) {
Expand All @@ -4877,7 +4980,9 @@ _public_ int ncm_link_set_ipv4(int argc, char *argv[]) {
return -EINVAL;
}

r = manager_set_ipv4(p, lla, dhcp, addrs, rt4, dns, use_dns, send_release, keep);
dns = strv_remove_duplicates(dns);
domains = strv_remove_duplicates(domains);
r = manager_set_ipv4(p, lla, dhcp, addrs, rt4, dns, domains, client_id, use_dns, use_domains, send_release, keep);
if (r < 0) {
log_warning("Failed to configure IPv4 on device '%s': %s", p->ifname, strerror(-r));
return r;
Expand Down
6 changes: 3 additions & 3 deletions src/manager/network-manager-ctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,10 +216,10 @@ static int help(void) {
"\n\t\t\t\t route [Prefix ADDRESS] route-lifetime [LifetimeSec NUMBER] Configures IPv6 Router Advertisement.\n"
" remove-ipv6ra dev [DEVICE] Removes Ipv6 Router Advertisement.\n"
" enable-ipv6 dev [DEVICE] [BOOLEAN] Enable or disables IPv6 on the link.\n"
" set-ipv4 dev [DEVICE] dhcp [BOOLEAN] addr [ADDRESS] many [ADDRESS1,ADDRESS2...] gw|gw4|g [GATEWAY] dns [SERVER1,SERVER2...]"
"\n\t\t\t\t lla [BOOLEAN|ipv6|ipv4] use-dns [BOOLEAN send-release [BOOLEAN] keep [BOOLEAN] Configures device IPv4.\n"
" set-ipv4 dev [DEVICE] dhcp [BOOLEAN] addr [ADDRESS] many [ADDRESS1,ADDRESS2...] gw|gw4|g [GATEWAY] dns [SERVER1,SERVER2...] domains [DOMAIN1,DOMAIN2 ...]"
"\n\t\t\t\t lla [BOOLEAN|ipv6|ipv4] cid|client-id [IDENTIFIER {mac|duid|duid-only} use-dns [BOOLEAN use-domains [route|BOOLEAN] send-release [BOOLEAN] keep [BOOLEAN] Configures device IPv4.\n"
" set-ipv6 dev [DEVICE] accept-ra [BOOLEAN] dhcp [BOOLEAN] address|a|addr [ADDRESS] many [ADDRESS1,ADDRESS2...] gw|gw6|g [GATEWAY]"
"\n\t\t\t\t lla [BOOLEAN|ipv6|ipv4] dns [SERVER1,SERVER2...] use-dns [BOOLEAN] send-release [BOOLEAN] keep [BOOLEAN] Configures device IPv6.\n"
"\n\t\t\t\t lla [BOOLEAN|ipv6|ipv4] dns [SERVER1,SERVER2...] domains [DOMAIN1,DOMAIN2 ...] use-dns [BOOLEAN] use-domains [route|BOOLEAN] send-release [BOOLEAN] keep [BOOLEAN] Configures device IPv6.\n"
" add-sr-iov dev [DEVICE] [vf INTEGER] [vlanid INTEGER] [qos INTEGER] [vlanproto STRING] [macspoofck BOOLEAN] [qrss BOOLEAN]"
"\n\t\t\t\t [trust BOOLEAN] [linkstate BOOLEAN or STRING] [macaddr ADDRESS] Configures SR-IOV VirtualFunction, "
"\n\t\t\t\t VLANId, QualityOfService, VLANProtocol, MACSpoofCheck, QueryReceiveSideScaling, Trust, LinkState, MACAddress \n"
Expand Down
Loading