You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
"Several networking final fixes and tidies for the merge window:
1) Changes during the merge window unintentionally took away the
ability to build bluetooth modular, fix from Geert Uytterhoeven.
2) Several phy_node reference count bug fixes from Uwe Kleine-König.
3) Fix ucc_geth build failures, also from Uwe Kleine-König.
4) Fix klog false positivies when netlink messages go to network
taps, by properly resetting the network header. Fix from Daniel
Borkmann.
5) Sizing estimate of VF netlink messages is too small, from Jiri
Benc.
6) New APM X-Gene SoC ethernet driver, from Iyappan Subramanian.
7) VLAN untagging is erroneously dependent upon whether the VLAN
module is loaded or not, but there are generic dependencies that
matter wrt what can be expected as the SKB enters the stack.
Make the basic untagging generic code, and do it unconditionally.
From Vlad Yasevich.
8) xen-netfront only has so many slots in it's transmit queue so
linearize packets that have too many frags. From Zoltan Kiss.
9) Fix suspend/resume PHY handling in bcmgenet driver, from Florian
Fainelli"
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (55 commits)
net: bcmgenet: correctly resume adapter from Wake-on-LAN
net: bcmgenet: update UMAC_CMD only when link is detected
net: bcmgenet: correctly suspend and resume PHY device
net: bcmgenet: request and enable main clock earlier
net: ethernet: myricom: myri10ge: myri10ge.c: Cleaning up missing null-terminate after strncpy call
xen-netfront: Fix handling packets on compound pages with skb_linearize
net: fec: Support phys probed from devicetree and fixed-link
smsc: replace WARN_ON() with WARN_ON_SMP()
xen-netback: Don't deschedule NAPI when carrier off
net: ethernet: qlogic: qlcnic: Remove duplicate object file from Makefile
wan: wanxl: Remove typedefs from struct names
m68k/atari: EtherNEC - ethernet support (ne)
net: ethernet: ti: cpmac.c: Cleaning up missing null-terminate after strncpy call
hdlc: Remove typedefs from struct names
airo_cs: Remove typedef local_info_t
atmel: Remove typedef atmel_priv_ioctl
com20020_cs: Remove typedef com20020_dev_t
ethernet: amd: Remove typedef local_info_t
net: Always untag vlan-tagged traffic on input.
drivers: net: Add APM X-Gene SoC ethernet driver support.
...
This commit is contained in:
+1
-1
@@ -1,5 +1,5 @@
|
||||
config 6LOWPAN
|
||||
bool "6LoWPAN Support"
|
||||
tristate "6LoWPAN Support"
|
||||
depends on IPV6
|
||||
---help---
|
||||
This enables IPv6 over Low power Wireless Personal Area Network -
|
||||
|
||||
@@ -112,59 +112,6 @@ __be16 vlan_dev_vlan_proto(const struct net_device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL(vlan_dev_vlan_proto);
|
||||
|
||||
static struct sk_buff *vlan_reorder_header(struct sk_buff *skb)
|
||||
{
|
||||
if (skb_cow(skb, skb_headroom(skb)) < 0) {
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 2 * ETH_ALEN);
|
||||
skb->mac_header += VLAN_HLEN;
|
||||
return skb;
|
||||
}
|
||||
|
||||
struct sk_buff *vlan_untag(struct sk_buff *skb)
|
||||
{
|
||||
struct vlan_hdr *vhdr;
|
||||
u16 vlan_tci;
|
||||
|
||||
if (unlikely(vlan_tx_tag_present(skb))) {
|
||||
/* vlan_tci is already set-up so leave this for another time */
|
||||
return skb;
|
||||
}
|
||||
|
||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||
if (unlikely(!skb))
|
||||
goto err_free;
|
||||
|
||||
if (unlikely(!pskb_may_pull(skb, VLAN_HLEN)))
|
||||
goto err_free;
|
||||
|
||||
vhdr = (struct vlan_hdr *) skb->data;
|
||||
vlan_tci = ntohs(vhdr->h_vlan_TCI);
|
||||
__vlan_hwaccel_put_tag(skb, skb->protocol, vlan_tci);
|
||||
|
||||
skb_pull_rcsum(skb, VLAN_HLEN);
|
||||
vlan_set_encap_proto(skb, vhdr);
|
||||
|
||||
skb = vlan_reorder_header(skb);
|
||||
if (unlikely(!skb))
|
||||
goto err_free;
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_transport_header(skb);
|
||||
skb_reset_mac_len(skb);
|
||||
|
||||
return skb;
|
||||
|
||||
err_free:
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(vlan_untag);
|
||||
|
||||
|
||||
/*
|
||||
* vlan info and vid list
|
||||
*/
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
#include "originator.h"
|
||||
#include "hard-interface.h"
|
||||
#include "translation-table.h"
|
||||
#include "multicast.h"
|
||||
|
||||
/**
|
||||
* batadv_mcast_mla_softif_get - get softif multicast listeners
|
||||
|
||||
@@ -181,7 +181,7 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v,
|
||||
*/
|
||||
if (unlikely(!vlan_tx_tag_present(skb) &&
|
||||
skb->protocol == proto)) {
|
||||
skb = vlan_untag(skb);
|
||||
skb = skb_vlan_untag(skb);
|
||||
if (unlikely(!skb))
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -327,10 +327,7 @@ find_inlist_lock_noload(struct list_head *head, const char *name, int *error,
|
||||
char name[EBT_FUNCTION_MAXNAMELEN];
|
||||
} *e;
|
||||
|
||||
*error = mutex_lock_interruptible(mutex);
|
||||
if (*error != 0)
|
||||
return NULL;
|
||||
|
||||
mutex_lock(mutex);
|
||||
list_for_each_entry(e, head, list) {
|
||||
if (strcmp(e->name, name) == 0)
|
||||
return e;
|
||||
@@ -1203,10 +1200,7 @@ ebt_register_table(struct net *net, const struct ebt_table *input_table)
|
||||
|
||||
table->private = newinfo;
|
||||
rwlock_init(&table->lock);
|
||||
ret = mutex_lock_interruptible(&ebt_mutex);
|
||||
if (ret != 0)
|
||||
goto free_chainstack;
|
||||
|
||||
mutex_lock(&ebt_mutex);
|
||||
list_for_each_entry(t, &net->xt.tables[NFPROTO_BRIDGE], list) {
|
||||
if (strcmp(t->name, table->name) == 0) {
|
||||
ret = -EEXIST;
|
||||
|
||||
+1
-1
@@ -3602,7 +3602,7 @@ another_round:
|
||||
|
||||
if (skb->protocol == cpu_to_be16(ETH_P_8021Q) ||
|
||||
skb->protocol == cpu_to_be16(ETH_P_8021AD)) {
|
||||
skb = vlan_untag(skb);
|
||||
skb = skb_vlan_untag(skb);
|
||||
if (unlikely(!skb))
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
@@ -804,7 +804,8 @@ static inline int rtnl_vfinfo_size(const struct net_device *dev,
|
||||
(nla_total_size(sizeof(struct ifla_vf_mac)) +
|
||||
nla_total_size(sizeof(struct ifla_vf_vlan)) +
|
||||
nla_total_size(sizeof(struct ifla_vf_spoofchk)) +
|
||||
nla_total_size(sizeof(struct ifla_vf_rate)));
|
||||
nla_total_size(sizeof(struct ifla_vf_rate)) +
|
||||
nla_total_size(sizeof(struct ifla_vf_link_state)));
|
||||
return size;
|
||||
} else
|
||||
return 0;
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/errqueue.h>
|
||||
#include <linux/prefetch.h>
|
||||
#include <linux/if_vlan.h>
|
||||
|
||||
#include <net/protocol.h>
|
||||
#include <net/dst.h>
|
||||
@@ -3973,3 +3974,55 @@ unsigned int skb_gso_transport_seglen(const struct sk_buff *skb)
|
||||
return shinfo->gso_size;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(skb_gso_transport_seglen);
|
||||
|
||||
static struct sk_buff *skb_reorder_vlan_header(struct sk_buff *skb)
|
||||
{
|
||||
if (skb_cow(skb, skb_headroom(skb)) < 0) {
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memmove(skb->data - ETH_HLEN, skb->data - VLAN_ETH_HLEN, 2 * ETH_ALEN);
|
||||
skb->mac_header += VLAN_HLEN;
|
||||
return skb;
|
||||
}
|
||||
|
||||
struct sk_buff *skb_vlan_untag(struct sk_buff *skb)
|
||||
{
|
||||
struct vlan_hdr *vhdr;
|
||||
u16 vlan_tci;
|
||||
|
||||
if (unlikely(vlan_tx_tag_present(skb))) {
|
||||
/* vlan_tci is already set-up so leave this for another time */
|
||||
return skb;
|
||||
}
|
||||
|
||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||
if (unlikely(!skb))
|
||||
goto err_free;
|
||||
|
||||
if (unlikely(!pskb_may_pull(skb, VLAN_HLEN)))
|
||||
goto err_free;
|
||||
|
||||
vhdr = (struct vlan_hdr *)skb->data;
|
||||
vlan_tci = ntohs(vhdr->h_vlan_TCI);
|
||||
__vlan_hwaccel_put_tag(skb, skb->protocol, vlan_tci);
|
||||
|
||||
skb_pull_rcsum(skb, VLAN_HLEN);
|
||||
vlan_set_encap_proto(skb, vhdr);
|
||||
|
||||
skb = skb_reorder_vlan_header(skb);
|
||||
if (unlikely(!skb))
|
||||
goto err_free;
|
||||
|
||||
skb_reset_network_header(skb);
|
||||
skb_reset_transport_header(skb);
|
||||
skb_reset_mac_len(skb);
|
||||
|
||||
return skb;
|
||||
|
||||
err_free:
|
||||
kfree_skb(skb);
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(skb_vlan_untag);
|
||||
|
||||
@@ -1798,8 +1798,6 @@ local_input:
|
||||
no_route:
|
||||
RT_CACHE_STAT_INC(in_no_route);
|
||||
res.type = RTN_UNREACHABLE;
|
||||
if (err == -ESRCH)
|
||||
err = -ENETUNREACH;
|
||||
goto local_input;
|
||||
|
||||
/*
|
||||
|
||||
@@ -35,11 +35,7 @@ EXPORT_SYMBOL_GPL(nf_ipv6_ops);
|
||||
|
||||
int nf_register_afinfo(const struct nf_afinfo *afinfo)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = mutex_lock_interruptible(&afinfo_mutex);
|
||||
if (err < 0)
|
||||
return err;
|
||||
mutex_lock(&afinfo_mutex);
|
||||
RCU_INIT_POINTER(nf_afinfo[afinfo->family], afinfo);
|
||||
mutex_unlock(&afinfo_mutex);
|
||||
return 0;
|
||||
@@ -68,11 +64,8 @@ static DEFINE_MUTEX(nf_hook_mutex);
|
||||
int nf_register_hook(struct nf_hook_ops *reg)
|
||||
{
|
||||
struct nf_hook_ops *elem;
|
||||
int err;
|
||||
|
||||
err = mutex_lock_interruptible(&nf_hook_mutex);
|
||||
if (err < 0)
|
||||
return err;
|
||||
mutex_lock(&nf_hook_mutex);
|
||||
list_for_each_entry(elem, &nf_hooks[reg->pf][reg->hooknum], list) {
|
||||
if (reg->priority < elem->priority)
|
||||
break;
|
||||
|
||||
@@ -2271,10 +2271,7 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
|
||||
cmd == IP_VS_SO_SET_STOPDAEMON) {
|
||||
struct ip_vs_daemon_user *dm = (struct ip_vs_daemon_user *)arg;
|
||||
|
||||
if (mutex_lock_interruptible(&ipvs->sync_mutex)) {
|
||||
ret = -ERESTARTSYS;
|
||||
goto out_dec;
|
||||
}
|
||||
mutex_lock(&ipvs->sync_mutex);
|
||||
if (cmd == IP_VS_SO_SET_STARTDAEMON)
|
||||
ret = start_sync_thread(net, dm->state, dm->mcast_ifn,
|
||||
dm->syncid);
|
||||
@@ -2284,11 +2281,7 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
|
||||
goto out_dec;
|
||||
}
|
||||
|
||||
if (mutex_lock_interruptible(&__ip_vs_mutex)) {
|
||||
ret = -ERESTARTSYS;
|
||||
goto out_dec;
|
||||
}
|
||||
|
||||
mutex_lock(&__ip_vs_mutex);
|
||||
if (cmd == IP_VS_SO_SET_FLUSH) {
|
||||
/* Flush the virtual service */
|
||||
ret = ip_vs_flush(net, false);
|
||||
@@ -2573,9 +2566,7 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
|
||||
struct ip_vs_daemon_user d[2];
|
||||
|
||||
memset(&d, 0, sizeof(d));
|
||||
if (mutex_lock_interruptible(&ipvs->sync_mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
mutex_lock(&ipvs->sync_mutex);
|
||||
if (ipvs->sync_state & IP_VS_STATE_MASTER) {
|
||||
d[0].state = IP_VS_STATE_MASTER;
|
||||
strlcpy(d[0].mcast_ifn, ipvs->master_mcast_ifn,
|
||||
@@ -2594,9 +2585,7 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (mutex_lock_interruptible(&__ip_vs_mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
mutex_lock(&__ip_vs_mutex);
|
||||
switch (cmd) {
|
||||
case IP_VS_SO_GET_VERSION:
|
||||
{
|
||||
|
||||
@@ -26,9 +26,7 @@ int nf_register_sockopt(struct nf_sockopt_ops *reg)
|
||||
struct nf_sockopt_ops *ops;
|
||||
int ret = 0;
|
||||
|
||||
if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0)
|
||||
return -EINTR;
|
||||
|
||||
mutex_lock(&nf_sockopt_mutex);
|
||||
list_for_each_entry(ops, &nf_sockopts, list) {
|
||||
if (ops->pf == reg->pf
|
||||
&& (overlap(ops->set_optmin, ops->set_optmax,
|
||||
@@ -65,9 +63,7 @@ static struct nf_sockopt_ops *nf_sockopt_find(struct sock *sk, u_int8_t pf,
|
||||
{
|
||||
struct nf_sockopt_ops *ops;
|
||||
|
||||
if (mutex_lock_interruptible(&nf_sockopt_mutex) != 0)
|
||||
return ERR_PTR(-EINTR);
|
||||
|
||||
mutex_lock(&nf_sockopt_mutex);
|
||||
list_for_each_entry(ops, &nf_sockopts, list) {
|
||||
if (ops->pf == pf) {
|
||||
if (!try_module_get(ops->owner))
|
||||
|
||||
@@ -899,6 +899,9 @@ static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr)
|
||||
static void nft_chain_stats_replace(struct nft_base_chain *chain,
|
||||
struct nft_stats __percpu *newstats)
|
||||
{
|
||||
if (newstats == NULL)
|
||||
return;
|
||||
|
||||
if (chain->stats) {
|
||||
struct nft_stats __percpu *oldstats =
|
||||
nft_dereference(chain->stats);
|
||||
@@ -3134,16 +3137,13 @@ static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
|
||||
goto err2;
|
||||
|
||||
trans = nft_trans_elem_alloc(ctx, NFT_MSG_DELSETELEM, set);
|
||||
if (trans == NULL)
|
||||
if (trans == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
nft_trans_elem(trans) = elem;
|
||||
list_add_tail(&trans->list, &ctx->net->nft.commit_list);
|
||||
|
||||
nft_data_uninit(&elem.key, NFT_DATA_VALUE);
|
||||
if (set->flags & NFT_SET_MAP)
|
||||
nft_data_uninit(&elem.data, set->dtype);
|
||||
|
||||
return 0;
|
||||
err2:
|
||||
nft_data_uninit(&elem.key, desc.type);
|
||||
@@ -3310,7 +3310,7 @@ static int nf_tables_commit(struct sk_buff *skb)
|
||||
{
|
||||
struct net *net = sock_net(skb->sk);
|
||||
struct nft_trans *trans, *next;
|
||||
struct nft_set *set;
|
||||
struct nft_trans_elem *te;
|
||||
|
||||
/* Bump generation counter, invalidate any dump in progress */
|
||||
while (++net->nft.base_seq == 0);
|
||||
@@ -3396,13 +3396,17 @@ static int nf_tables_commit(struct sk_buff *skb)
|
||||
nft_trans_destroy(trans);
|
||||
break;
|
||||
case NFT_MSG_DELSETELEM:
|
||||
nf_tables_setelem_notify(&trans->ctx,
|
||||
nft_trans_elem_set(trans),
|
||||
&nft_trans_elem(trans),
|
||||
te = (struct nft_trans_elem *)trans->data;
|
||||
nf_tables_setelem_notify(&trans->ctx, te->set,
|
||||
&te->elem,
|
||||
NFT_MSG_DELSETELEM, 0);
|
||||
set = nft_trans_elem_set(trans);
|
||||
set->ops->get(set, &nft_trans_elem(trans));
|
||||
set->ops->remove(set, &nft_trans_elem(trans));
|
||||
te->set->ops->get(te->set, &te->elem);
|
||||
te->set->ops->remove(te->set, &te->elem);
|
||||
nft_data_uninit(&te->elem.key, NFT_DATA_VALUE);
|
||||
if (te->elem.flags & NFT_SET_MAP) {
|
||||
nft_data_uninit(&te->elem.data,
|
||||
te->set->dtype);
|
||||
}
|
||||
nft_trans_destroy(trans);
|
||||
break;
|
||||
}
|
||||
|
||||
+12
-35
@@ -71,18 +71,14 @@ static const char *const xt_prefix[NFPROTO_NUMPROTO] = {
|
||||
static const unsigned int xt_jumpstack_multiplier = 2;
|
||||
|
||||
/* Registration hooks for targets. */
|
||||
int
|
||||
xt_register_target(struct xt_target *target)
|
||||
int xt_register_target(struct xt_target *target)
|
||||
{
|
||||
u_int8_t af = target->family;
|
||||
int ret;
|
||||
|
||||
ret = mutex_lock_interruptible(&xt[af].mutex);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
mutex_lock(&xt[af].mutex);
|
||||
list_add(&target->list, &xt[af].target);
|
||||
mutex_unlock(&xt[af].mutex);
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(xt_register_target);
|
||||
|
||||
@@ -125,20 +121,14 @@ xt_unregister_targets(struct xt_target *target, unsigned int n)
|
||||
}
|
||||
EXPORT_SYMBOL(xt_unregister_targets);
|
||||
|
||||
int
|
||||
xt_register_match(struct xt_match *match)
|
||||
int xt_register_match(struct xt_match *match)
|
||||
{
|
||||
u_int8_t af = match->family;
|
||||
int ret;
|
||||
|
||||
ret = mutex_lock_interruptible(&xt[af].mutex);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
mutex_lock(&xt[af].mutex);
|
||||
list_add(&match->list, &xt[af].match);
|
||||
mutex_unlock(&xt[af].mutex);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(xt_register_match);
|
||||
|
||||
@@ -194,9 +184,7 @@ struct xt_match *xt_find_match(u8 af, const char *name, u8 revision)
|
||||
struct xt_match *m;
|
||||
int err = -ENOENT;
|
||||
|
||||
if (mutex_lock_interruptible(&xt[af].mutex) != 0)
|
||||
return ERR_PTR(-EINTR);
|
||||
|
||||
mutex_lock(&xt[af].mutex);
|
||||
list_for_each_entry(m, &xt[af].match, list) {
|
||||
if (strcmp(m->name, name) == 0) {
|
||||
if (m->revision == revision) {
|
||||
@@ -239,9 +227,7 @@ struct xt_target *xt_find_target(u8 af, const char *name, u8 revision)
|
||||
struct xt_target *t;
|
||||
int err = -ENOENT;
|
||||
|
||||
if (mutex_lock_interruptible(&xt[af].mutex) != 0)
|
||||
return ERR_PTR(-EINTR);
|
||||
|
||||
mutex_lock(&xt[af].mutex);
|
||||
list_for_each_entry(t, &xt[af].target, list) {
|
||||
if (strcmp(t->name, name) == 0) {
|
||||
if (t->revision == revision) {
|
||||
@@ -323,10 +309,7 @@ int xt_find_revision(u8 af, const char *name, u8 revision, int target,
|
||||
{
|
||||
int have_rev, best = -1;
|
||||
|
||||
if (mutex_lock_interruptible(&xt[af].mutex) != 0) {
|
||||
*err = -EINTR;
|
||||
return 1;
|
||||
}
|
||||
mutex_lock(&xt[af].mutex);
|
||||
if (target == 1)
|
||||
have_rev = target_revfn(af, name, revision, &best);
|
||||
else
|
||||
@@ -732,9 +715,7 @@ struct xt_table *xt_find_table_lock(struct net *net, u_int8_t af,
|
||||
{
|
||||
struct xt_table *t;
|
||||
|
||||
if (mutex_lock_interruptible(&xt[af].mutex) != 0)
|
||||
return ERR_PTR(-EINTR);
|
||||
|
||||
mutex_lock(&xt[af].mutex);
|
||||
list_for_each_entry(t, &net->xt.tables[af], list)
|
||||
if (strcmp(t->name, name) == 0 && try_module_get(t->me))
|
||||
return t;
|
||||
@@ -883,10 +864,7 @@ struct xt_table *xt_register_table(struct net *net,
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = mutex_lock_interruptible(&xt[table->af].mutex);
|
||||
if (ret != 0)
|
||||
goto out_free;
|
||||
|
||||
mutex_lock(&xt[table->af].mutex);
|
||||
/* Don't autoload: we'd eat our tail... */
|
||||
list_for_each_entry(t, &net->xt.tables[table->af], list) {
|
||||
if (strcmp(t->name, table->name) == 0) {
|
||||
@@ -911,9 +889,8 @@ struct xt_table *xt_register_table(struct net *net,
|
||||
mutex_unlock(&xt[table->af].mutex);
|
||||
return table;
|
||||
|
||||
unlock:
|
||||
unlock:
|
||||
mutex_unlock(&xt[table->af].mutex);
|
||||
out_free:
|
||||
kfree(table);
|
||||
out:
|
||||
return ERR_PTR(ret);
|
||||
|
||||
@@ -213,7 +213,7 @@ static int __netlink_deliver_tap_skb(struct sk_buff *skb,
|
||||
nskb->protocol = htons((u16) sk->sk_protocol);
|
||||
nskb->pkt_type = netlink_is_kernel(sk) ?
|
||||
PACKET_KERNEL : PACKET_USER;
|
||||
|
||||
skb_reset_network_header(nskb);
|
||||
ret = dev_queue_xmit(nskb);
|
||||
if (unlikely(ret > 0))
|
||||
ret = net_xmit_errno(ret);
|
||||
|
||||
@@ -47,8 +47,6 @@
|
||||
#include <linux/openvswitch.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/genetlink.h>
|
||||
#include <net/genetlink.h>
|
||||
#include <net/genetlink.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <net/netns/generic.h>
|
||||
|
||||
Reference in New Issue
Block a user