mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
net/ipv6/ip6_gre.c is a case of parallel adds. include/trace/events/tcp.h is a little bit more tricky. The removal of in-trace-macro ifdefs in 'net' paralleled with moving show_tcp_state_name and friends over to include/trace/events/sock.h in 'net-next'. Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
commit
6bb8824732
212 changed files with 2378 additions and 1204 deletions
|
|
@ -8,15 +8,29 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <linux/bottom_half.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <net/dst.h>
|
||||
#include <net/ip.h>
|
||||
#include <net/xfrm.h>
|
||||
#include <net/ip_tunnels.h>
|
||||
#include <net/ip6_tunnel.h>
|
||||
|
||||
struct xfrm_trans_tasklet {
|
||||
struct tasklet_struct tasklet;
|
||||
struct sk_buff_head queue;
|
||||
};
|
||||
|
||||
struct xfrm_trans_cb {
|
||||
int (*finish)(struct net *net, struct sock *sk, struct sk_buff *skb);
|
||||
};
|
||||
|
||||
#define XFRM_TRANS_SKB_CB(__skb) ((struct xfrm_trans_cb *)&((__skb)->cb[0]))
|
||||
|
||||
static struct kmem_cache *secpath_cachep __read_mostly;
|
||||
|
||||
static DEFINE_SPINLOCK(xfrm_input_afinfo_lock);
|
||||
|
|
@ -25,6 +39,8 @@ static struct xfrm_input_afinfo const __rcu *xfrm_input_afinfo[AF_INET6 + 1];
|
|||
static struct gro_cells gro_cells;
|
||||
static struct net_device xfrm_napi_dev;
|
||||
|
||||
static DEFINE_PER_CPU(struct xfrm_trans_tasklet, xfrm_trans_tasklet);
|
||||
|
||||
int xfrm_input_register_afinfo(const struct xfrm_input_afinfo *afinfo)
|
||||
{
|
||||
int err = 0;
|
||||
|
|
@ -207,7 +223,7 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
|
|||
xfrm_address_t *daddr;
|
||||
struct xfrm_mode *inner_mode;
|
||||
u32 mark = skb->mark;
|
||||
unsigned int family;
|
||||
unsigned int family = AF_UNSPEC;
|
||||
int decaps = 0;
|
||||
int async = 0;
|
||||
bool xfrm_gro = false;
|
||||
|
|
@ -216,6 +232,16 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
|
|||
|
||||
if (encap_type < 0) {
|
||||
x = xfrm_input_state(skb);
|
||||
|
||||
if (unlikely(x->km.state != XFRM_STATE_VALID)) {
|
||||
if (x->km.state == XFRM_STATE_ACQ)
|
||||
XFRM_INC_STATS(net, LINUX_MIB_XFRMACQUIREERROR);
|
||||
else
|
||||
XFRM_INC_STATS(net,
|
||||
LINUX_MIB_XFRMINSTATEINVALID);
|
||||
goto drop;
|
||||
}
|
||||
|
||||
family = x->outer_mode->afinfo->family;
|
||||
|
||||
/* An encap_type of -1 indicates async resumption. */
|
||||
|
|
@ -466,9 +492,41 @@ int xfrm_input_resume(struct sk_buff *skb, int nexthdr)
|
|||
}
|
||||
EXPORT_SYMBOL(xfrm_input_resume);
|
||||
|
||||
static void xfrm_trans_reinject(unsigned long data)
|
||||
{
|
||||
struct xfrm_trans_tasklet *trans = (void *)data;
|
||||
struct sk_buff_head queue;
|
||||
struct sk_buff *skb;
|
||||
|
||||
__skb_queue_head_init(&queue);
|
||||
skb_queue_splice_init(&trans->queue, &queue);
|
||||
|
||||
while ((skb = __skb_dequeue(&queue)))
|
||||
XFRM_TRANS_SKB_CB(skb)->finish(dev_net(skb->dev), NULL, skb);
|
||||
}
|
||||
|
||||
int xfrm_trans_queue(struct sk_buff *skb,
|
||||
int (*finish)(struct net *, struct sock *,
|
||||
struct sk_buff *))
|
||||
{
|
||||
struct xfrm_trans_tasklet *trans;
|
||||
|
||||
trans = this_cpu_ptr(&xfrm_trans_tasklet);
|
||||
|
||||
if (skb_queue_len(&trans->queue) >= netdev_max_backlog)
|
||||
return -ENOBUFS;
|
||||
|
||||
XFRM_TRANS_SKB_CB(skb)->finish = finish;
|
||||
skb_queue_tail(&trans->queue, skb);
|
||||
tasklet_schedule(&trans->tasklet);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_trans_queue);
|
||||
|
||||
void __init xfrm_input_init(void)
|
||||
{
|
||||
int err;
|
||||
int i;
|
||||
|
||||
init_dummy_netdev(&xfrm_napi_dev);
|
||||
err = gro_cells_init(&gro_cells, &xfrm_napi_dev);
|
||||
|
|
@ -479,4 +537,13 @@ void __init xfrm_input_init(void)
|
|||
sizeof(struct sec_path),
|
||||
0, SLAB_HWCACHE_ALIGN|SLAB_PANIC,
|
||||
NULL);
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
struct xfrm_trans_tasklet *trans;
|
||||
|
||||
trans = &per_cpu(xfrm_trans_tasklet, i);
|
||||
__skb_queue_head_init(&trans->queue);
|
||||
tasklet_init(&trans->tasklet, xfrm_trans_reinject,
|
||||
(unsigned long)trans);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1168,9 +1168,15 @@ static struct xfrm_policy *xfrm_sk_policy_lookup(const struct sock *sk, int dir,
|
|||
again:
|
||||
pol = rcu_dereference(sk->sk_policy[dir]);
|
||||
if (pol != NULL) {
|
||||
bool match = xfrm_selector_match(&pol->selector, fl, family);
|
||||
bool match;
|
||||
int err = 0;
|
||||
|
||||
if (pol->family != family) {
|
||||
pol = NULL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
match = xfrm_selector_match(&pol->selector, fl, family);
|
||||
if (match) {
|
||||
if ((sk->sk_mark & pol->mark.m) != pol->mark.v) {
|
||||
pol = NULL;
|
||||
|
|
@ -1835,6 +1841,7 @@ xfrm_resolve_and_create_bundle(struct xfrm_policy **pols, int num_pols,
|
|||
sizeof(struct xfrm_policy *) * num_pols) == 0 &&
|
||||
xfrm_xdst_can_reuse(xdst, xfrm, err)) {
|
||||
dst_hold(&xdst->u.dst);
|
||||
xfrm_pols_put(pols, num_pols);
|
||||
while (err > 0)
|
||||
xfrm_state_put(xfrm[--err]);
|
||||
return xdst;
|
||||
|
|
|
|||
|
|
@ -1343,6 +1343,7 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig,
|
|||
|
||||
if (orig->aead) {
|
||||
x->aead = xfrm_algo_aead_clone(orig->aead);
|
||||
x->geniv = orig->geniv;
|
||||
if (!x->aead)
|
||||
goto error;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1419,11 +1419,14 @@ static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut,
|
|||
|
||||
static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family)
|
||||
{
|
||||
u16 prev_family;
|
||||
int i;
|
||||
|
||||
if (nr > XFRM_MAX_DEPTH)
|
||||
return -EINVAL;
|
||||
|
||||
prev_family = family;
|
||||
|
||||
for (i = 0; i < nr; i++) {
|
||||
/* We never validated the ut->family value, so many
|
||||
* applications simply leave it at zero. The check was
|
||||
|
|
@ -1435,6 +1438,12 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family)
|
|||
if (!ut[i].family)
|
||||
ut[i].family = family;
|
||||
|
||||
if ((ut[i].mode == XFRM_MODE_TRANSPORT) &&
|
||||
(ut[i].family != prev_family))
|
||||
return -EINVAL;
|
||||
|
||||
prev_family = ut[i].family;
|
||||
|
||||
switch (ut[i].family) {
|
||||
case AF_INET:
|
||||
break;
|
||||
|
|
@ -1445,6 +1454,21 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family)
|
|||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (ut[i].id.proto) {
|
||||
case IPPROTO_AH:
|
||||
case IPPROTO_ESP:
|
||||
case IPPROTO_COMP:
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
case IPPROTO_ROUTING:
|
||||
case IPPROTO_DSTOPTS:
|
||||
#endif
|
||||
case IPSEC_PROTO_ANY:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -2470,7 +2494,7 @@ static const struct nla_policy xfrma_policy[XFRMA_MAX+1] = {
|
|||
[XFRMA_PROTO] = { .type = NLA_U8 },
|
||||
[XFRMA_ADDRESS_FILTER] = { .len = sizeof(struct xfrm_address_filter) },
|
||||
[XFRMA_OFFLOAD_DEV] = { .len = sizeof(struct xfrm_user_offload) },
|
||||
[XFRMA_OUTPUT_MARK] = { .len = NLA_U32 },
|
||||
[XFRMA_OUTPUT_MARK] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
static const struct nla_policy xfrma_spd_policy[XFRMA_SPD_MAX+1] = {
|
||||
|
|
|
|||
Loading…
Reference in a new issue