| From 612c7552fbedd2a6a93691353c692040cc797641 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Asbj=C3=B8rn=20Sloth=20T=C3=B8nnesen?= <ast@fiberby.dk> |
| Date: Mon, 1 Feb 2016 13:30:05 +0000 |
| Subject: [PATCH 2/4] conntrack: extend parse_addr() with CIDR support |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Signed-off-by: Asbjørn Sloth Tønnesen <ast@fiberby.dk> |
| --- |
| src/conntrack.c | 35 ++++++++++++++++++++++++++++------- |
| 1 file changed, 28 insertions(+), 7 deletions(-) |
| |
| diff --git a/src/conntrack.c b/src/conntrack.c |
| index 8272d4c..fab21d9 100644 |
| --- a/src/conntrack.c |
| +++ b/src/conntrack.c |
| @@ -1029,22 +1029,43 @@ parse_inetaddr(const char *cp, struct addr_parse *parse) |
| } |
| |
| static int |
| -parse_addr(const char *cp, union ct_address *address) |
| +parse_addr(const char *cp, union ct_address *address, int *mask) |
| { |
| + char buf[INET6_ADDRSTRLEN]; |
| struct addr_parse parse; |
| - int ret; |
| + char *slash, *end; |
| + int family; |
| + |
| + strncpy((char *) &buf, cp, INET6_ADDRSTRLEN); |
| + buf[INET6_ADDRSTRLEN - 1] = '\0'; |
| + |
| + if (mask != NULL) { |
| + slash = strchr(buf, '/'); |
| + if (slash != NULL) { |
| + *mask = strtol(slash+1, &end, 10); |
| + if (*mask < 0 || end != slash+strlen(slash)) |
| + *mask = -2; /* invalid netmask */ |
| + slash[0] = '\0'; |
| + } else { |
| + *mask = -1; /* no netmask */ |
| + } |
| + } |
| |
| - ret = parse_inetaddr(cp, &parse); |
| - switch (ret) { |
| + family = parse_inetaddr(cp, &parse); |
| + switch (family) { |
| case AF_INET: |
| address->v4 = parse.addr.s_addr; |
| + if (mask != NULL && *mask > 32) |
| + *mask = -2; /* invalid netmask */ |
| break; |
| case AF_INET6: |
| memcpy(address->v6, &parse.addr6, sizeof(parse.addr6)); |
| + if (mask != NULL && *mask > 128) |
| + *mask = -2; /* invalid netmask */ |
| break; |
| } |
| |
| - return ret; |
| + return family; |
| } |
| |
| static void |
| @@ -1086,7 +1107,7 @@ nat_parse(char *arg, struct nf_conntrack *obj, int type) |
| } |
| } |
| |
| - if (parse_addr(arg, &parse) == AF_UNSPEC) { |
| + if (parse_addr(arg, &parse, NULL) == AF_UNSPEC) { |
| if (strlen(arg) == 0) { |
| exit_error(PARAMETER_PROBLEM, "No IP specified"); |
| } else { |
| @@ -2107,7 +2128,7 @@ nfct_parse_addr_from_opt(int opt, struct nf_conntrack *ct, |
| { |
| int l3protonum; |
| |
| - l3protonum = parse_addr(optarg, ad); |
| + l3protonum = parse_addr(optarg, ad, NULL); |
| if (l3protonum == AF_UNSPEC) { |
| exit_error(PARAMETER_PROBLEM, |
| "Invalid IP address `%s'", optarg); |
| -- |
| 2.1.4 |
| |