mirror of
https://github.com/systemd/systemd.git
synced 2024-11-06 08:26:52 +03:00
network: serialize/deserialize address family
This commit is contained in:
parent
0aabccc87d
commit
43e08c78c7
@ -3,6 +3,7 @@
|
|||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <linux/fib_rules.h>
|
#include <linux/fib_rules.h>
|
||||||
|
|
||||||
|
#include "af-list.h"
|
||||||
#include "alloc-util.h"
|
#include "alloc-util.h"
|
||||||
#include "conf-parser.h"
|
#include "conf-parser.h"
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
@ -989,6 +990,7 @@ int routing_policy_serialize_rules(Set *rules, FILE *f) {
|
|||||||
SET_FOREACH(rule, rules, i) {
|
SET_FOREACH(rule, rules, i) {
|
||||||
_cleanup_free_ char *from_str = NULL, *to_str = NULL;
|
_cleanup_free_ char *from_str = NULL, *to_str = NULL;
|
||||||
bool space = false;
|
bool space = false;
|
||||||
|
const char *family_str;
|
||||||
|
|
||||||
fputs("RULE=", f);
|
fputs("RULE=", f);
|
||||||
|
|
||||||
@ -1013,6 +1015,12 @@ int routing_policy_serialize_rules(Set *rules, FILE *f) {
|
|||||||
space = true;
|
space = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
family_str = af_to_name(rule->family);
|
||||||
|
if (family_str)
|
||||||
|
fprintf(f, "%sfamily=%s",
|
||||||
|
space ? " " : "",
|
||||||
|
family_str);
|
||||||
|
|
||||||
if (rule->tos != 0) {
|
if (rule->tos != 0) {
|
||||||
fprintf(f, "%stos=%hhu",
|
fprintf(f, "%stos=%hhu",
|
||||||
space ? " " : "",
|
space ? " " : "",
|
||||||
@ -1135,6 +1143,13 @@ int routing_policy_load_rules(const char *state_file, Set **rules) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
} else if (streq(a, "family")) {
|
||||||
|
r = af_from_name(b);
|
||||||
|
if (r < 0) {
|
||||||
|
log_error_errno(r, "Failed to parse RPDB rule family, ignoring: %s", b);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
rule->family = r;
|
||||||
} else if (streq(a, "tos")) {
|
} else if (streq(a, "tos")) {
|
||||||
r = safe_atou8(b, &rule->tos);
|
r = safe_atou8(b, &rule->tos);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
|
@ -62,31 +62,31 @@ int main(int argc, char **argv) {
|
|||||||
test_setup_logging(LOG_DEBUG);
|
test_setup_logging(LOG_DEBUG);
|
||||||
|
|
||||||
test_rule_serialization("basic parsing",
|
test_rule_serialization("basic parsing",
|
||||||
"RULE=from=1.2.3.4/32 to=2.3.4.5/32 tos=5 fwmark=1/2 table=10", NULL);
|
"RULE=from=1.2.3.4/32 to=2.3.4.5/32 family=AF_INET tos=5 fwmark=1/2 table=10", NULL);
|
||||||
|
|
||||||
test_rule_serialization("ignored values",
|
test_rule_serialization("ignored values",
|
||||||
"RULE=something=to=ignore from=1.2.3.4/32 from=1.2.3.4/32"
|
"RULE=something=to=ignore from=1.2.3.4/32 from=1.2.3.4/32"
|
||||||
" \t to=2.3.4.5/24 to=2.3.4.5/32 tos=5 fwmark=2 fwmark=1 table=10 table=20",
|
" \t to=2.3.4.5/24 to=2.3.4.5/32 tos=5 fwmark=2 fwmark=1 table=10 table=20",
|
||||||
"RULE=from=1.2.3.4/32"
|
"RULE=from=1.2.3.4/32"
|
||||||
" to=2.3.4.5/32 tos=5 fwmark=1/0 table=20");
|
" to=2.3.4.5/32 family=AF_INET tos=5 fwmark=1/0 table=20");
|
||||||
|
|
||||||
test_rule_serialization("ipv6",
|
test_rule_serialization("ipv6",
|
||||||
"RULE=from=1::2/64 to=2::3/64 table=6", NULL);
|
"RULE=from=1::2/64 to=2::3/64 family=AF_INET6 table=6", NULL);
|
||||||
|
|
||||||
assert_se(asprintf(&p, "RULE=from=1::2/64 to=2::3/64 table=%d", RT_TABLE_MAIN) >= 0);
|
assert_se(asprintf(&p, "RULE=from=1::2/64 to=2::3/64 family=AF_INET6 table=%d", RT_TABLE_MAIN) >= 0);
|
||||||
test_rule_serialization("default table",
|
test_rule_serialization("default table",
|
||||||
"RULE=from=1::2/64 to=2::3/64", p);
|
"RULE=from=1::2/64 to=2::3/64", p);
|
||||||
|
|
||||||
test_rule_serialization("incoming interface",
|
test_rule_serialization("incoming interface",
|
||||||
"RULE=from=1::2/64 to=2::3/64 table=1 iif=lo",
|
"RULE=from=1::2/64 to=2::3/64 table=1 iif=lo",
|
||||||
"RULE=from=1::2/64 to=2::3/64 iif=lo table=1");
|
"RULE=from=1::2/64 to=2::3/64 family=AF_INET6 iif=lo table=1");
|
||||||
|
|
||||||
test_rule_serialization("outgoing interface",
|
test_rule_serialization("outgoing interface",
|
||||||
"RULE=from=1::2/64 to=2::3/64 oif=eth0 table=1", NULL);
|
"RULE=from=1::2/64 to=2::3/64 family=AF_INET6 oif=eth0 table=1", NULL);
|
||||||
|
|
||||||
test_rule_serialization("freeing interface names",
|
test_rule_serialization("freeing interface names",
|
||||||
"RULE=from=1::2/64 to=2::3/64 iif=e0 iif=e1 oif=e0 oif=e1 table=1",
|
"RULE=from=1::2/64 to=2::3/64 family=AF_INET6 iif=e0 iif=e1 oif=e0 oif=e1 table=1",
|
||||||
"RULE=from=1::2/64 to=2::3/64 iif=e1 oif=e1 table=1");
|
"RULE=from=1::2/64 to=2::3/64 family=AF_INET6 iif=e1 oif=e1 table=1");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user