Re: [PATCHv2] netfilter: nfnetlink_log:add support for VLAN information

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 20, 2019 at 01:26:17PM +0200, Michael Braun wrote:
[...]
> diff --git a/include/uapi/linux/netfilter/nfnetlink_log.h b/include/uapi/linux/netfilter/nfnetlink_log.h
> index 20983cb195a0..45c8d3b027e0 100644
> --- a/include/uapi/linux/netfilter/nfnetlink_log.h
> +++ b/include/uapi/linux/netfilter/nfnetlink_log.h
> @@ -33,6 +33,15 @@ struct nfulnl_msg_packet_timestamp {
>  	__aligned_be64	usec;
>  };
>  
> +enum nfulnl_vlan_attr {
> +	NFULA_VLAN_UNSPEC,
> +	NFULA_VLAN_PROTO,		/* __be16 skb vlan_proto */
> +	NFULA_VLAN_TCI,			/* __be16 skb htons(vlan_tci) */
> +	__NFULA_VLAN_MAX,
> +};
> +
> +#define NFULA_VLAN_MAX (__NFULA_VLAN_MAX + 1)
> +
>  enum nfulnl_attr_type {
>  	NFULA_UNSPEC,
>  	NFULA_PACKET_HDR,
> @@ -54,6 +63,8 @@ enum nfulnl_attr_type {
>  	NFULA_HWLEN,			/* hardware header length */
>  	NFULA_CT,                       /* nf_conntrack_netlink.h */
>  	NFULA_CT_INFO,                  /* enum ip_conntrack_info */
> +	NFULA_VLAN,			/* nested attribute: packet vlan info */
> +	NFULA_L2HDR,			/* full L2 header */
>  
>  	__NFULA_MAX
>  };
> diff --git a/net/netfilter/nf_log_common.c b/net/netfilter/nf_log_common.c
> index ae5628ddbe6d..c127bcc119d8 100644
> --- a/net/netfilter/nf_log_common.c
> +++ b/net/netfilter/nf_log_common.c
> @@ -167,6 +167,8 @@ nf_log_dump_packet_common(struct nf_log_buf *m, u_int8_t pf,
>  	physoutdev = nf_bridge_get_physoutdev(skb);
>  	if (physoutdev && out != physoutdev)
>  		nf_log_buf_add(m, "PHYSOUT=%s ", physoutdev->name);
> +	if (skb_vlan_tag_present(skb))
> +		nf_log_buf_add(m, "VLAN=%d ", skb_vlan_tag_get_id(skb));
>  #endif
>  }
>  EXPORT_SYMBOL_GPL(nf_log_dump_packet_common);
> diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c
> index 6dee4f9a944c..dd5b63205d31 100644
> --- a/net/netfilter/nfnetlink_log.c
> +++ b/net/netfilter/nfnetlink_log.c
> @@ -385,6 +385,40 @@ nfulnl_timer(struct timer_list *t)
>  	instance_put(inst);
>  }
>  
> +#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)

This could be used from nftables netdev family (ingress type chains),
I think you can remove this #if.

Unlike nfqueue, there's support for nfnetlink_log from nftables netdev
family. You can test it with this:

table netdev x {
        chain y {
                type filter hook ingress device "eth0" priority filter; policy accept;
                log prefix "test: " group 10
        }
}

I think you can safely remove this #if.

> +static int nfulnl_put_bridge(struct nfulnl_instance *inst, struct sk_buff *skb)
> +{
> +	if (!skb_mac_header_was_set(skb))
> +		return 0;
> +
> +	if (skb_vlan_tag_present(skb)) {
> +		struct nlattr *nest;
> +
> +		nest = nla_nest_start(inst->skb, NFULA_VLAN);
> +		if (!nest)
> +			goto nla_put_failure;
> +
> +		if (nla_put_be16(inst->skb, NFULA_VLAN_TCI, htons(skb->vlan_tci)) ||
> +		    nla_put_be16(inst->skb, NFULA_VLAN_PROTO, skb->vlan_proto))
> +			goto nla_put_failure;
> +
> +		nla_nest_end(inst->skb, nest);
> +	}
> +
> +	if (skb->mac_header < skb->network_header) {
> +		int len = (int)(skb->network_header - skb->mac_header);
> +
> +		if (nla_put(inst->skb, NFULA_L2HDR, len, skb_mac_header(skb)))
> +			goto nla_put_failure;
> +	}
> +
> +	return 0;
> +
> +nla_put_failure:
> +	return -1;
> +}
> +#endif /* IS_ENABLED(CONFIG_BRIDGE_NETFILTER) */
> +
>  /* This is an inline function, we don't really care about a long
>   * list of arguments */
>  static inline int
> @@ -580,6 +614,12 @@ __build_packet_message(struct nfnl_log_net *log,
>  				 NFULA_CT, NFULA_CT_INFO) < 0)
>  		goto nla_put_failure;
>  
> +#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
> +	if (pf == PF_BRIDGE &&

Allow for NFPROTO_NETDEV where too, please.

Thanks.



[Index of Archives]     [Netfitler Users]     [Berkeley Packet Filter]     [LARTC]     [Bugtraq]     [Yosemite Forum]

  Powered by Linux