Esempio n. 1
0
void br_forward(struct net_bridge_port *to, struct sk_buff *skb)
{
	if (should_deliver(to, skb)) {
		__br_forward(to, skb);
		return;
	}

	kfree_skb(skb);
}
Esempio n. 2
0
/* called with rcu_read_lock */
void vnsw_deliver(const struct vnsw_if *to, struct sk_buff *skb)
{
	if (should_deliver(to, skb)) {
		__vnsw_deliver(to, skb);
		return;
	}

	kfree_skb(skb);
}
Esempio n. 3
0
/* called with rcu_read_lock */
void vnsw_forward(const struct vnsw_if *to, struct sk_buff *skb, struct sk_buff *skb0)
{
	if (should_deliver(to, skb)) {
		if (skb0)
			deliver_clone(to, skb, __vnsw_forward);
		else
			__vnsw_forward(to, skb);
		return;
	}

	if (!skb0)
		kfree_skb(skb);
}
Esempio n. 4
0
static void br_flood(struct net_bridge *br, struct sk_buff *skb, int clone,
	void (*__packet_hook)(struct net_bridge_port *p, struct sk_buff *skb))
{
	struct net_bridge_port *p;
	struct net_bridge_port *prev;

	if (clone) {
		struct sk_buff *skb2;

		if ((skb2 = skb_clone(skb, GFP_ATOMIC)) == NULL) {
			br->statistics.tx_dropped++;
			return;
		}

		skb = skb2;
	}

	prev = NULL;

	p = br->port_list;
	while (p != NULL) {
		if (should_deliver(p, skb)) {
			if (prev != NULL) {
				struct sk_buff *skb2;

				if ((skb2 = skb_clone(skb, GFP_ATOMIC)) == NULL) {
					br->statistics.tx_dropped++;
					kfree_skb(skb);
					return;
				}

				__packet_hook(prev, skb2);
			}

			prev = p;
		}

		p = p->next;
	}

	if (prev != NULL) {
		__packet_hook(prev, skb);
		return;
	}

	kfree_skb(skb);
}
Esempio n. 5
0
static struct vnsw_if *maybe_deliver(
	struct vnsw_if *ifprev, struct vnsw_if *ifp,
	struct sk_buff *skb,
	void (*__packet_hook)(const struct vnsw_if *ifp,
			      struct sk_buff *skb))
{
	int err;

	if (!should_deliver(p, skb))
		return prev;

	if (!prev)
		goto out;

        /**
         * Need to check if we deliver clone?
         */
	err = deliver_clone(prev, skb, __packet_hook);
	if (err)
		return ERR_PTR(err);

out:
	return ifp;
}