The commit is pushed to "branch-rh7-3.10.0-327.10.1.vz7.12.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after rh7-3.10.0-327.10.1.vz7.12.3 ------> commit 31f6eaf97d683147f23d0b1e2df18286209520c9 Author: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> Date: Thu Mar 24 19:53:32 2016 +0400
vzprivnet: Weak sparse networks Port diff-vz-privnet-weak-sparse privnet: Weak sparse networks As per Vitaly Obernikhin request - weak private nets support is required for weak ones :\ Nobody wants to add the required "external" ip addresses to priv-network. Signed-off-by: Pavel Emelyanov <xe...@parallels.com> Signed-off-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> --- net/ipv4/netfilter/ip_vzprivnet.c | 53 ++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/net/ipv4/netfilter/ip_vzprivnet.c b/net/ipv4/netfilter/ip_vzprivnet.c index 170b0c5..01933ac 100644 --- a/net/ipv4/netfilter/ip_vzprivnet.c +++ b/net/ipv4/netfilter/ip_vzprivnet.c @@ -521,7 +521,7 @@ static struct file_operations proc_vzprivnet_ops = { .write = vzpriv_write, }; -static int sparse_add(unsigned int netid, u32 ip, u32 mask) +static int sparse_add(unsigned int netid, u32 ip, u32 mask, int weak) { int err; struct vzprivnet_sparse *pns, *epns = NULL; @@ -565,6 +565,8 @@ found_net: list_add_tail(&pne->list, &pns->entries); tree_insert(&entries_root, &pne->range); pne = NULL; + } else if (weak) { + pns->pn.weak = 1; } else if (pns == epns) { err = -EEXIST; goto out_unlock; @@ -609,13 +611,16 @@ static void sparse_free_one(struct vzprivnet_sparse *pns) kfree(pns); } -static int sparse_del_net(unsigned int netid) +static int sparse_del_net(unsigned int netid, int weak) { struct vzprivnet_sparse *pns; list_for_each_entry(pns, &vzpriv_sparse, list) if (pns->netid == netid) { - sparse_free_one(pns); + if (weak) + pns->pn.weak = 0; + else + sparse_free_one(pns); return 0; } @@ -637,7 +642,7 @@ static int sparse_del_ip(u32 ip) return 0; } -static int sparse_del(unsigned int netid, u32 ip) +static int sparse_del(unsigned int netid, u32 ip, int weak) { int err; @@ -645,7 +650,7 @@ static int sparse_del(unsigned int netid, u32 ip) if (ip != 0) err = sparse_del_ip(ip); else - err = sparse_del_net(netid); + err = sparse_del_net(netid, weak); write_unlock_bh(&vzprivlock); return err; @@ -655,15 +660,17 @@ static int sparse_del(unsigned int netid, u32 ip) * +ID to add a network * +ID:a.b.c.d to add an IP to network * +ID:a.b.c.d/m to add a subnet to network + * +ID:* to make a network weak * -ID to remove the whole network * -a.b.c.d to remove an IP or bounding subnet (from its network) + * -ID:* to make a network "strong" ;) * * No weak networks here! */ #define is_eol(ch) ((ch) == '\0' || (ch) == '\n') -static int parse_sparse_add(const char *str, unsigned int *netid, u32 *ip, u32 *mask) +static int parse_sparse_add(const char *str, unsigned int *netid, u32 *ip, u32 *mask, int *weak) { unsigned int m; char *end; @@ -678,6 +685,14 @@ static int parse_sparse_add(const char *str, unsigned int *netid, u32 *ip, u32 * return -EINVAL; str = end + 1; + if (*str == '*') { + if (!is_eol(*(str + 1))) + return -EINVAL; + + *weak = 1; + return 0; + } + if (!in4_pton(str, -1, (u8 *)ip, -1, (const char **)&end)) return -EINVAL; @@ -698,30 +713,35 @@ static int parse_sparse_add(const char *str, unsigned int *netid, u32 *ip, u32 * return 0; } -static int parse_sparse_remove(const char *str, unsigned int *netid, u32 *ip) +static int parse_sparse_remove(const char *str, unsigned int *netid, u32 *ip, int *weak) { char *end; if (strchr(str, '.')) { if (!in4_pton(str, -1, (u8 *)ip, -1, (const char **)&end)) return -EINVAL; - } else + } else { *netid = simple_strtol(str, &end, 10); + if (end[0] == ':' && end[1] == '*') { + end += 2; + *weak = 1; + } + } return (is_eol(*end) ? 0 : -EINVAL); } static int parse_sparse(const char *param, int *add, - unsigned int *netid, u32 *ip, u32 *mask) + unsigned int *netid, u32 *ip, u32 *mask, int *weak) { if (param[0] == '+') { *add = 1; - return parse_sparse_add(param + 1, netid, ip, mask); + return parse_sparse_add(param + 1, netid, ip, mask, weak); } if (param[0] == '-') { *add = 0; - return parse_sparse_remove(param + 1, netid, ip); + return parse_sparse_remove(param + 1, netid, ip, weak); } return -EINVAL; @@ -752,18 +772,18 @@ static ssize_t sparse_write(struct file * file, const char __user *buf, err = -EINVAL; while (*s) { - int add; + int add, weak = 0; unsigned int netid = 0; u32 ip = 0, mask = 0; - err = parse_sparse(s, &add, &netid, &ip, &mask); + err = parse_sparse(s, &add, &netid, &ip, &mask, &weak); if (err) goto out; if (add) - err = sparse_add(netid, ip, mask); + err = sparse_add(netid, ip, mask, weak); else - err = sparse_del(netid, ip); + err = sparse_del(netid, ip, weak); if (err) goto out; @@ -804,6 +824,9 @@ static int sparse_seq_show(struct seq_file *s, void *v) pns = list_entry(lh, struct vzprivnet_sparse, list); seq_printf(s, "%u: ", pns->netid); + if (pns->pn.weak) + seq_puts(s, "* "); + list_for_each_entry(pne, &pns->entries, list) { seq_printf(s, "%pI4", &pne->range.netip); if (~pne->range.rmask != 0) /* subnet */ _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel