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.