Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 07317621 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by David S. Miller
Browse files

[NETFILTER] bridge: code rearrangement for clarity



Cleanup and rearrangement for better style and clarity:
	Split the function nf_bridge_maybe_copy_header into two pieces
	Move copy portion out of line.
	Use Ethernet header size macros.
	Use header file to handle CONFIG_NETFILTER_BRIDGE differences

Signed-off-by: default avatarStephen Hemminger <shemminger@osdl.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cd360007
Loading
Loading
Loading
Loading
+7 −19
Original line number Diff line number Diff line
@@ -47,25 +47,11 @@ enum nf_br_hook_priorities {


/* Only used in br_forward.c */
static inline
int nf_bridge_maybe_copy_header(struct sk_buff *skb)
extern int nf_bridge_copy_header(struct sk_buff *skb);
static inline int nf_bridge_maybe_copy_header(struct sk_buff *skb)
{
	int err;

	if (skb->nf_bridge) {
		if (skb->protocol == __constant_htons(ETH_P_8021Q)) {
			err = skb_cow(skb, 18);
			if (err)
				return err;
			memcpy(skb->data - 18, skb->nf_bridge->data, 18);
			skb_push(skb, 4);
		} else {
			err = skb_cow(skb, 16);
			if (err)
				return err;
			memcpy(skb->data - 16, skb->nf_bridge->data, 16);
		}
	}
	if (skb->nf_bridge)
		return nf_bridge_copy_header(skb);
  	return 0;
}

@@ -90,6 +76,8 @@ struct bridge_skb_cb {
};

extern int brnf_deferred_hooks;
#else
#define nf_bridge_maybe_copy_header(skb)	(0)
#endif /* CONFIG_BRIDGE_NETFILTER */

#endif /* __KERNEL__ */
+1 −4
Original line number Diff line number Diff line
@@ -38,13 +38,10 @@ int br_dev_queue_push_xmit(struct sk_buff *skb)
	if (packet_length(skb) > skb->dev->mtu && !skb_is_gso(skb))
		kfree_skb(skb);
	else {
#ifdef CONFIG_BRIDGE_NETFILTER
		/* ip_refrag calls ip_fragment, doesn't copy the MAC header. */
		if (nf_bridge_maybe_copy_header(skb))
			kfree_skb(skb);
		else
#endif
		{
		else {
			skb_push(skb, ETH_HLEN);

			dev_queue_xmit(skb);
+25 −2
Original line number Diff line number Diff line
@@ -127,14 +127,37 @@ static inline struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb)

static inline void nf_bridge_save_header(struct sk_buff *skb)
{
        int header_size = 16;
        int header_size = ETH_HLEN;

	if (skb->protocol == htons(ETH_P_8021Q))
		header_size = 18;
		header_size += VLAN_HLEN;

	memcpy(skb->nf_bridge->data, skb->data - header_size, header_size);
}

/*
 * When forwarding bridge frames, we save a copy of the original
 * header before processing.
 */
int nf_bridge_copy_header(struct sk_buff *skb)
{
	int err;
        int header_size = ETH_HLEN;

	if (skb->protocol == htons(ETH_P_8021Q))
		header_size += VLAN_HLEN;

	err = skb_cow(skb, header_size);
	if (err)
		return err;

	memcpy(skb->data - header_size, skb->nf_bridge->data, header_size);

	if (skb->protocol == htons(ETH_P_8021Q))
		__skb_push(skb, VLAN_HLEN);
	return 0;
}

/* PF_BRIDGE/PRE_ROUTING *********************************************/
/* Undo the changes made for ip6tables PREROUTING and continue the
 * bridge PRE_ROUTING hook. */