Hi, I'm sorry for this email in Spanish, I forgot to trim off Cc when reviewing some cosmestic stuff. On Thu, Jul 12, 2018 at 10:18:32PM +0200, Pablo Neira Ayuso wrote: > On Thu, Jul 12, 2018 at 12:34:14PM +0200, Fernando Fernandez Mancera wrote: > > Added _ADD and _REMOVE commands to nf_tables_api.c in order to use the > > nf_tables interface to add 'osf' signatures in nft. > > > > Signed-off-by: Fernando Fernandez Mancera <ffmancera@xxxxxxxxxx> > > --- > > include/net/netfilter/nf_tables_core.h | 2 + > > include/uapi/linux/netfilter/nf_osf.h | 8 ++ > > include/uapi/linux/netfilter/nf_tables.h | 14 +++ > > include/uapi/linux/netfilter/xt_osf.h | 7 +- > > net/netfilter/nf_tables_api.c | 110 +++++++++++++++++++++++ > > net/netfilter/nft_osf.c | 1 + > > 6 files changed, 136 insertions(+), 6 deletions(-) > > > > diff --git a/include/net/netfilter/nf_tables_core.h b/include/net/netfilter/nf_tables_core.h > > index e0c0c2558ec4..ee7eabc8d3e1 100644 > > --- a/include/net/netfilter/nf_tables_core.h > > +++ b/include/net/netfilter/nf_tables_core.h > > @@ -65,4 +65,6 @@ extern const struct nft_expr_ops nft_payload_fast_ops; > > extern struct static_key_false nft_counters_enabled; > > extern struct static_key_false nft_trace_enabled; > > > > +extern struct list_head nft_osf_fingers[2]; > > + > > #endif /* _NET_NF_TABLES_CORE_H */ > > diff --git a/include/uapi/linux/netfilter/nf_osf.h b/include/uapi/linux/netfilter/nf_osf.h > > index 79882b2f7f8e..35352c1cd994 100644 > > --- a/include/uapi/linux/netfilter/nf_osf.h > > +++ b/include/uapi/linux/netfilter/nf_osf.h > > @@ -2,6 +2,8 @@ > > #define _NF_OSF_H > > > > #include <linux/types.h> > > +#include <linux/ip.h> > > +#include <linux/tcp.h> > > > > #define MAXGENRELEN 32 > > > > @@ -90,4 +92,10 @@ enum iana_options { > > OSFOPT_EMPTY = 255, > > }; > > > > +enum nf_osf_attr_type { > > + OSF_ATTR_UNSPEC, > > + OSF_ATTR_FINGER, > > + OSF_ATTR_MAX, > > +}; > > + > > #endif /* _NF_OSF_H */ > > diff --git a/include/uapi/linux/netfilter/nf_tables.h b/include/uapi/linux/netfilter/nf_tables.h > > index c9bf74b94f37..beffa2010b20 100644 > > --- a/include/uapi/linux/netfilter/nf_tables.h > > +++ b/include/uapi/linux/netfilter/nf_tables.h > > @@ -9,6 +9,8 @@ > > #define NFT_OBJ_MAXNAMELEN NFT_NAME_MAXLEN > > #define NFT_USERDATA_MAXLEN 256 > > > > +#define OSF_GENRE_SIZE 32 > > + > > /** > > * enum nft_registers - nf_tables registers > > * > > @@ -122,6 +124,8 @@ enum nf_tables_msg_types { > > NFT_MSG_NEWFLOWTABLE, > > NFT_MSG_GETFLOWTABLE, > > NFT_MSG_DELFLOWTABLE, > > + NFT_MSG_NEWOSF, > > + NFT_MSG_DELOSF, > > NFT_MSG_MAX, > > }; > > > > @@ -1461,6 +1465,16 @@ enum nft_flowtable_hook_attributes { > > }; > > #define NFTA_FLOWTABLE_HOOK_MAX (__NFTA_FLOWTABLE_HOOK_MAX - 1) > > > > +enum nft_osf_attributes { > > + NFTA_OSF_UNSPEC, > > + NFTA_OSF_GENRE, > > + NFTA_OSF_FLAGS, > > + NFTA_OSF_LOGLEVEL, > > + NFTA_OSF_TTL, > > + __NFTA_OSF_MAX, > > +}; > > +#define NFTA_OSF_MAX (__NFTA_OSF_MAX - 1) > > + > > /** > > * enum nft_device_attributes - nf_tables device netlink attributes > > * > > diff --git a/include/uapi/linux/netfilter/xt_osf.h b/include/uapi/linux/netfilter/xt_osf.h > > index 2f5d4e6d0434..b7c0f93fe9d4 100644 > > --- a/include/uapi/linux/netfilter/xt_osf.h > > +++ b/include/uapi/linux/netfilter/xt_osf.h > > @@ -51,6 +51,7 @@ > > #define xt_osf_finger nf_osf_finger > > #define xt_osf_nlmsg nf_osf_nlmsg > > > > +#define xt_osf_attr_type nf_osf_attr_type > > /* > > * Add/remove fingerprint from the kernel. > > */ > > @@ -60,10 +61,4 @@ enum xt_osf_msg_types { > > OSF_MSG_MAX, > > }; > > > > -enum xt_osf_attr_type { > > - OSF_ATTR_UNSPEC, > > - OSF_ATTR_FINGER, > > - OSF_ATTR_MAX, > > -}; > > - > > #endif /* _XT_OSF_H */ > > diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c > > index ca4c4d994ddb..1783d8ef658c 100644 > > --- a/net/netfilter/nf_tables_api.c > > +++ b/net/netfilter/nf_tables_api.c > > @@ -17,6 +17,7 @@ > > #include <linux/netfilter.h> > > #include <linux/netfilter/nfnetlink.h> > > #include <linux/netfilter/nf_tables.h> > > +#include <linux/netfilter/nf_osf.h> > > #include <net/netfilter/nf_flow_table.h> > > #include <net/netfilter/nf_tables_core.h> > > #include <net/netfilter/nf_tables.h> > > @@ -26,6 +27,7 @@ > > static LIST_HEAD(nf_tables_expressions); > > static LIST_HEAD(nf_tables_objects); > > static LIST_HEAD(nf_tables_flowtables); > > + > > Por favor, evita este ruido en los parche. > > > static u64 table_handle; > > > > enum { > > @@ -5851,6 +5853,8 @@ static int nf_tables_flowtable_event(struct notifier_block *this, > > return NOTIFY_DONE; > > } > > > > + > > + > > Estas dos líneas nuevas es también ruido, no pertenecen a este > problema. > > > static struct notifier_block nf_tables_flowtable_notifier = { > > .notifier_call = nf_tables_flowtable_event, > > }; > > @@ -5908,6 +5912,102 @@ static int nf_tables_getgen(struct net *net, struct sock *nlsk, > > return err; > > } > > > > +struct list_head nft_osf_fingers[2]; > > +EXPORT_SYMBOL_GPL(nft_osf_fingers); > > + > > +static int nf_tables_newosf(struct net *net, struct sock *ctnl, > > + struct sk_buff *skb, const struct nlmsghdr *nlh, > > + const struct nlattr * const osf_attrs[], > > + struct netlink_ext_ack *extack) > > +{ > > + struct nf_osf_user_finger *f; > > + struct nf_osf_finger *kf = NULL, *sf; > > + int err = 0; > > + int i = 0; > > + > > + if (!capable(CAP_NET_ADMIN)) > > + return -EPERM; > > + if (!osf_attrs[OSF_ATTR_FINGER]) > > + return -EINVAL; > > + > > + if (!(nlh->nlmsg_flags & NLM_F_CREATE)) > > + return -EINVAL; > > + > > + f = nla_data(osf_attrs[OSF_ATTR_FINGER]); > > + > > + kf = kmalloc(sizeof(struct nf_osf_finger), GFP_KERNEL); > > + if (!kf) > > + return -ENOMEM; > > + > > + for (i = 0; i < ARRAY_SIZE(nft_osf_fingers); ++i) > > + INIT_LIST_HEAD(&nft_osf_fingers[i]); > > + > > + memcpy(&kf->finger, f, sizeof(struct nf_osf_user_finger)); > > + > > + list_for_each_entry(sf, &nft_osf_fingers[!!f->df], finger_entry) { > > + if (memcmp(&sf->finger, f, sizeof(struct nf_osf_user_finger))) > > + continue; > > + > > + kfree(kf); > > + kf = NULL; > > + > > + if (nlh->nlmsg_flags & NLM_F_EXCL) > > + err = -EEXIST; > > + break; > > + } > > + > > + /* > > + * We are protected by nfnl mutex. > > + */ > > + if (kf) > > + list_add_tail_rcu(&kf->finger_entry, &nft_osf_fingers[!!f->df]); > > + > > + return err; > > +} > > + > > +static int nf_tables_delosf(struct net *net, struct sock *ctnl, > > + struct sk_buff *skb, > > + const struct nlmsghdr *nlh, > > + const struct nlattr * const osf_attrs[], > > + struct netlink_ext_ack *extack) > > +{ > > + struct nf_osf_user_finger *f; > > + struct nf_osf_finger *sf; > > + int err = -ENOENT; > > + > > + if (!capable(CAP_NET_ADMIN)) > > + return -EPERM; > > + > > + if (!osf_attrs[OSF_ATTR_FINGER]) > > + return -EINVAL; > > + > > + f = nla_data(osf_attrs[OSF_ATTR_FINGER]); > > + > > + list_for_each_entry(sf, &nft_osf_fingers[!!f->df], finger_entry) { > > + if (memcmp(&sf->finger, f, sizeof(struct nf_osf_user_finger))) > > + continue; > > + > > + /* > > + * We are protected by nfnl mutex. > > + */ > > + list_del_rcu(&sf->finger_entry); > > + kfree_rcu(sf, rcu_head); > > + > > + err = 0; > > + break; > > + } > > + > > + return err; > > +} > > + > > +static const struct nla_policy nft_osf_policy[NFTA_OSF_MAX + 1] = { > > + [NFTA_OSF_GENRE] = { .type = NLA_STRING, .len = OSF_GENRE_SIZE }, > > + [NFTA_OSF_FLAGS] = { .type = NLA_U32 }, > > + [NFTA_OSF_LOGLEVEL] = { .type = NLA_U32 }, > > + [NFTA_OSF_TTL] = { .type = NLA_U32 }, > > +}; > > + > > static const struct nfnl_callback nf_tables_cb[NFT_MSG_MAX] = { > > [NFT_MSG_NEWTABLE] = { > > .call_batch = nf_tables_newtable, > > @@ -6022,6 +6122,16 @@ static const struct nfnl_callback nf_tables_cb[NFT_MSG_MAX] = { > > .attr_count = NFTA_FLOWTABLE_MAX, > > .policy = nft_flowtable_policy, > > }, > > + [NFT_MSG_NEWOSF] = { > > + .call_batch = nf_tables_newosf, > > + .attr_count = NFTA_OSF_MAX, > > + .policy = nft_osf_policy, > > + }, > > + [NFT_MSG_DELOSF] = { > > + .call_batch = nf_tables_delosf, > > + .attr_count = NFTA_OSF_MAX, > > + .policy = nft_osf_policy, > > + }, > > }; > > > > static int nf_tables_validate(struct net *net) > > diff --git a/net/netfilter/nft_osf.c b/net/netfilter/nft_osf.c > > index 30c503f2bf53..cf8a38b052ad 100644 > > --- a/net/netfilter/nft_osf.c > > +++ b/net/netfilter/nft_osf.c > > @@ -54,6 +54,7 @@ static int nft_osf_init(const struct nft_ctx *ctx, > > return -EINVAL; > > priv->ttl = ntohl(nla_get_be32(tb[NFTA_OSF_TTL])); > > priv->len = strlen(priv->genre); > > + > > De nuevo línea innecesaria. > > Intenta ser meticuloso con lo que presentas, pues da la sensación a > quien lo envías que no eres cuidadoso con los detalles... > > > return 0; > > } > > > > -- > > 2.18.0 > > > > -- > > To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in > > the body of a message to majordomo@xxxxxxxxxxxxxxx > > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html