Inline…

> On Apr 20, 2017, at 10:05 AM, Pierre Lebleu <pme.leb...@gmail.com> wrote:
> 
> It gives the ability to create ipset rules via procd
> services and netifd interface firewall data.
> 
> Signed-off-by: Pierre Lebleu <pme.leb...@gmail.com>
> ---
> ipsets.c |   83 +++++++++++++++++++++++++++++++++++++++++++-------------------
> ipsets.h |   11 +++++----
> main.c   |    2 +-
> 3 files changed, 65 insertions(+), 31 deletions(-)
> 
> diff --git a/ipsets.c b/ipsets.c
> index 3b1ba00..a3e8ee7 100644
> --- a/ipsets.c
> +++ b/ipsets.c
> @@ -85,7 +85,7 @@ static struct ipset_type ipset_types[] = {
> 
> 
> static bool
> -check_types(struct uci_element *e, struct fw3_ipset *ipset)
> +check_types(struct fw3_ipset *ipset)
> {
>       int i = 0;
>       uint32_t typelist = 0;
> @@ -95,7 +95,8 @@ check_types(struct uci_element *e, struct fw3_ipset *ipset)
>       {
>               if (i >= 3)
>               {
> -                     warn_elem(e, "must not have more than 3 datatypes 
> assigned");
> +                     warn("%s must not have more than 3 datatypes assigned",
> +                             ipset->name);
>                       return false;
>               }
> 
> @@ -116,8 +117,9 @@ check_types(struct uci_element *e, struct fw3_ipset 
> *ipset)
>                       {
>                               ipset->method = ipset_types[i].method;
> 
> -                             warn_elem(e, "defines no storage method, 
> assuming '%s'",
> -                                       
> fw3_ipset_method_names[ipset->method]);
> +                             warn("%s defines no storage method, assuming 
> '%s'",
> +                                     ipset->name,
> +                                     fw3_ipset_method_names[ipset->method]);
> 
>                               break;
>                       }
> @@ -136,56 +138,56 @@ check_types(struct uci_element *e, struct fw3_ipset 
> *ipset)
>                               if ((ipset_types[i].required & OPT_IPRANGE) &&
>                                       !ipset->iprange.set)
>                               {
> -                                     warn_elem(e, "requires an ip range");
> +                                     warn("%s requires an ip range", 
> ipset->name);
>                                       return false;
>                               }
> 
>                               if ((ipset_types[i].required & OPT_PORTRANGE) &&
>                                   !ipset->portrange.set)
>                               {
> -                                     warn_elem(e, "requires a port range");
> +                                     warn("%s requires a port range", 
> ipset->name);
>                                       return false;
>                               }
> 
>                               if (!(ipset_types[i].required & OPT_IPRANGE) &&
>                                   ipset->iprange.set)
>                               {
> -                                     warn_elem(e, "iprange ignored");
> +                                     warn("%s iprange ignored", ipset->name);
>                                       ipset->iprange.set = false;
>                               }
> 
>                               if (!(ipset_types[i].required & OPT_PORTRANGE) 
> &&
>                                   ipset->portrange.set)
>                               {
> -                                     warn_elem(e, "portrange ignored");
> +                                     warn("%s portrange ignored", 
> ipset->name);
>                                       ipset->portrange.set = false;
>                               }
> 
>                               if (!(ipset_types[i].optional & OPT_NETMASK) &&
>                                   ipset->netmask > 0)
>                               {
> -                                     warn_elem(e, "netmask ignored");
> +                                     warn("%s netmask ignored", ipset->name);
>                                       ipset->netmask = 0;
>                               }
> 
>                               if (!(ipset_types[i].optional & OPT_HASHSIZE) &&
>                                   ipset->hashsize > 0)
>                               {
> -                                     warn_elem(e, "hashsize ignored");
> +                                     warn("%s hashsize ignored", 
> ipset->name);
>                                       ipset->hashsize = 0;
>                               }
> 
>                               if (!(ipset_types[i].optional & OPT_MAXELEM) &&
>                                   ipset->maxelem > 0)
>                               {
> -                                     warn_elem(e, "maxelem ignored");
> +                                     warn("%s maxelem ignored", ipset->name);
>                                       ipset->maxelem = 0;
>                               }
> 
>                               if (!(ipset_types[i].optional & OPT_FAMILY) &&
>                                   ipset->family != FW3_FAMILY_V4)
>                               {
> -                                     warn_elem(e, "family ignored");
> +                                     warn("%s family ignored", ipset->name);
>                                       ipset->family = FW3_FAMILY_V4;
>                               }
>                       }
> @@ -194,12 +196,12 @@ check_types(struct uci_element *e, struct fw3_ipset 
> *ipset)
>               }
>       }
> 
> -     warn_elem(e, "has an invalid combination of storage method and 
> matches");
> +     warn("%s has an invalid combination of storage method and matches", 
> ipset->name);
>       return false;
> }
> 
> -struct fw3_ipset *
> -fw3_alloc_ipset(void)
> +static struct fw3_ipset *
> +fw3_alloc_ipset(struct fw3_state *state)
> {
>       struct fw3_ipset *ipset;
> 
> @@ -212,21 +214,50 @@ fw3_alloc_ipset(void)
>       ipset->enabled = true;
>       ipset->family  = FW3_FAMILY_V4;
> 
> +     list_add_tail(&ipset->list, &state->ipsets);
> +
>       return ipset;
> }
> 
> void
> -fw3_load_ipsets(struct fw3_state *state, struct uci_package *p)
> +fw3_load_ipsets(struct fw3_state *state, struct uci_package *p,
> +             struct blob_attr *a)
> {
>       struct uci_section *s;
>       struct uci_element *e;
> -     struct fw3_ipset *ipset;
> +     struct fw3_ipset *ipset, *n;
> +     struct blob_attr *entry, *opt;
> +     unsigned rem, orem;
> 
>       INIT_LIST_HEAD(&state->ipsets);
> 
>       if (state->disable_ipsets)
>               return;
> 
> +     blob_for_each_attr(entry, a, rem)
> +     {
> +             const char *type = NULL;
> +             const char *name = "ubus ipset";
> +             blobmsg_for_each_attr(opt, entry, orem)
> +                     if (!strcmp(blobmsg_name(opt), "type"))
> +                             type = blobmsg_get_string(opt);
> +                     else if (!strcmp(blobmsg_name(opt), "name"))
> +                             name = blobmsg_get_string(opt);
> +
> +             if (!type || strcmp(type, "ipset"))
> +                     continue;
> +
> +             if (!(ipset = fw3_alloc_ipset(state)))


Minor nit…  Assignments inside of conditionals are a bear to step through in a 
debugger like GDB.

-Philip



> +                     continue;
> +
> +             if (!fw3_parse_blob_options(ipset, fw3_ipset_opts, entry, name))
> +             {
> +                     warn("%s skipped due to invalid options\n", name);
> +                     fw3_free_ipset(ipset);
> +                     continue;
> +             }
> +     }
> +
>       uci_foreach_element(&p->sections, e)
>       {
>               s = uci_to_section(e);
> @@ -234,7 +265,7 @@ fw3_load_ipsets(struct fw3_state *state, struct 
> uci_package *p)
>               if (strcmp(s->type, "ipset"))
>                       continue;
> 
> -             ipset = fw3_alloc_ipset();
> +             ipset = fw3_alloc_ipset(state);
> 
>               if (!ipset)
>                       continue;
> @@ -245,7 +276,10 @@ fw3_load_ipsets(struct fw3_state *state, struct 
> uci_package *p)
>                       fw3_free_ipset(ipset);
>                       continue;
>               }
> +     }
> 
> +     list_for_each_entry_safe(ipset, n, &state->ipsets, list)
> +     {
>               if (ipset->external)
>               {
>                       if (!*ipset->external)
> @@ -256,27 +290,26 @@ fw3_load_ipsets(struct fw3_state *state, struct 
> uci_package *p)
> 
>               if (!ipset->name || !*ipset->name)
>               {
> -                     warn_elem(e, "must have a name assigned");
> +                     warn("ipset must have a name assigned");
>               }
>               //else if (fw3_lookup_ipset(state, ipset->name) != NULL)
>               //{
> -             //      warn_elem(e, "has duplicated set name '%s'", 
> ipset->name);
> +             //      warn("%s has duplicated set name", ipset->name);
>               //}
>               else if (ipset->family == FW3_FAMILY_ANY)
>               {
> -                     warn_elem(e, "must not have family 'any'");
> +                     warn("%s must not have family 'any'", ipset->name);
>               }
>               else if (ipset->iprange.set && ipset->family != 
> ipset->iprange.family)
>               {
> -                     warn_elem(e, "has iprange of wrong address family");
> +                     warn("%s has iprange of wrong address family", 
> ipset->name);
>               }
>               else if (list_empty(&ipset->datatypes))
>               {
> -                     warn_elem(e, "has no datatypes assigned");
> +                     warn("%s has no datatypes assigned", ipset->name);
>               }
> -             else if (check_types(e, ipset))
> +             else if (check_types(ipset))
>               {
> -                     list_add_tail(&ipset->list, &state->ipsets);
>                       continue;
>               }
> 
> diff --git a/ipsets.h b/ipsets.h
> index b5fee6c..2ba862d 100644
> --- a/ipsets.h
> +++ b/ipsets.h
> @@ -27,8 +27,7 @@
> 
> extern const struct fw3_option fw3_ipset_opts[];
> 
> -struct fw3_ipset * fw3_alloc_ipset(void);
> -void fw3_load_ipsets(struct fw3_state *state, struct uci_package *p);
> +void fw3_load_ipsets(struct fw3_state *state, struct uci_package *p, struct 
> blob_attr *a);
> void fw3_create_ipsets(struct fw3_state *state);
> void fw3_destroy_ipsets(struct fw3_state *state);
> 
> @@ -36,9 +35,11 @@ struct fw3_ipset * fw3_lookup_ipset(struct fw3_state 
> *state, const char *name);
> 
> bool fw3_check_ipset(struct fw3_ipset *set);
> 
> -#define fw3_free_ipset(ipset) \
> -     fw3_free_object(ipset, fw3_ipset_opts)
> -
> +static inline void fw3_free_ipset(struct fw3_ipset *ipset)
> +{
> +     list_del(&ipset->list);
> +     fw3_free_object(ipset, fw3_ipset_opts);
> +}
> 
> #ifndef SO_IP_SET
> 
> diff --git a/main.c b/main.c
> index 4cf46fd..6e275ef 100644
> --- a/main.c
> +++ b/main.c
> @@ -101,7 +101,7 @@ build_state(bool runtime)
>       fw3_ubus_rules(&b);
> 
>       fw3_load_defaults(state, p);
> -     fw3_load_ipsets(state, p);
> +     fw3_load_ipsets(state, p, b.head);
>       fw3_load_zones(state, p);
>       fw3_load_rules(state, p, b.head);
>       fw3_load_redirects(state, p, b.head);
> -- 
> 1.7.9.5
> 
> 
> _______________________________________________
> Lede-dev mailing list
> Lede-dev@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/lede-dev


_______________________________________________
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev

Reply via email to