mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: arch/arm/boot/dts/imx6sx-sdb.dts net/sched/cls_bpf.c Two simple sets of overlapping changes. Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
commit
95f873f2ff
457 changed files with 4418 additions and 3193 deletions
|
|
@ -393,11 +393,10 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
|||
|
||||
memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
|
||||
sin = &errhdr.offender;
|
||||
sin->sin6_family = AF_UNSPEC;
|
||||
memset(sin, 0, sizeof(*sin));
|
||||
|
||||
if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) {
|
||||
sin->sin6_family = AF_INET6;
|
||||
sin->sin6_flowinfo = 0;
|
||||
sin->sin6_port = 0;
|
||||
if (np->rxopt.all) {
|
||||
if (serr->ee.ee_origin != SO_EE_ORIGIN_ICMP &&
|
||||
serr->ee.ee_origin != SO_EE_ORIGIN_ICMP6)
|
||||
|
|
@ -412,12 +411,9 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
|||
ipv6_iface_scope_id(&sin->sin6_addr,
|
||||
IP6CB(skb)->iif);
|
||||
} else {
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
|
||||
ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr,
|
||||
&sin->sin6_addr);
|
||||
sin->sin6_scope_id = 0;
|
||||
if (inet->cmsg_flags)
|
||||
if (inet_sk(sk)->cmsg_flags)
|
||||
ip_cmsg_recv(msg, skb);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -661,6 +661,29 @@ static int fib6_commit_metrics(struct dst_entry *dst, struct mx6_config *mxc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn,
|
||||
struct net *net)
|
||||
{
|
||||
if (atomic_read(&rt->rt6i_ref) != 1) {
|
||||
/* This route is used as dummy address holder in some split
|
||||
* nodes. It is not leaked, but it still holds other resources,
|
||||
* which must be released in time. So, scan ascendant nodes
|
||||
* and replace dummy references to this route with references
|
||||
* to still alive ones.
|
||||
*/
|
||||
while (fn) {
|
||||
if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) {
|
||||
fn->leaf = fib6_find_prefix(net, fn);
|
||||
atomic_inc(&fn->leaf->rt6i_ref);
|
||||
rt6_release(rt);
|
||||
}
|
||||
fn = fn->parent;
|
||||
}
|
||||
/* No more references are possible at this point. */
|
||||
BUG_ON(atomic_read(&rt->rt6i_ref) != 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert routing information in a node.
|
||||
*/
|
||||
|
|
@ -808,11 +831,12 @@ add:
|
|||
rt->dst.rt6_next = iter->dst.rt6_next;
|
||||
atomic_inc(&rt->rt6i_ref);
|
||||
inet6_rt_notify(RTM_NEWROUTE, rt, info);
|
||||
rt6_release(iter);
|
||||
if (!(fn->fn_flags & RTN_RTINFO)) {
|
||||
info->nl_net->ipv6.rt6_stats->fib_route_nodes++;
|
||||
fn->fn_flags |= RTN_RTINFO;
|
||||
}
|
||||
fib6_purge_rt(iter, fn, info->nl_net);
|
||||
rt6_release(iter);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -1323,24 +1347,7 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp,
|
|||
fn = fib6_repair_tree(net, fn);
|
||||
}
|
||||
|
||||
if (atomic_read(&rt->rt6i_ref) != 1) {
|
||||
/* This route is used as dummy address holder in some split
|
||||
* nodes. It is not leaked, but it still holds other resources,
|
||||
* which must be released in time. So, scan ascendant nodes
|
||||
* and replace dummy references to this route with references
|
||||
* to still alive ones.
|
||||
*/
|
||||
while (fn) {
|
||||
if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) {
|
||||
fn->leaf = fib6_find_prefix(net, fn);
|
||||
atomic_inc(&fn->leaf->rt6i_ref);
|
||||
rt6_release(rt);
|
||||
}
|
||||
fn = fn->parent;
|
||||
}
|
||||
/* No more references are possible at this point. */
|
||||
BUG_ON(atomic_read(&rt->rt6i_ref) != 1);
|
||||
}
|
||||
fib6_purge_rt(rt, fn, net);
|
||||
|
||||
inet6_rt_notify(RTM_DELROUTE, rt, info);
|
||||
rt6_release(rt);
|
||||
|
|
|
|||
|
|
@ -1160,12 +1160,9 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
|
|||
struct net *net = dev_net(dst->dev);
|
||||
|
||||
rt6->rt6i_flags |= RTF_MODIFIED;
|
||||
if (mtu < IPV6_MIN_MTU) {
|
||||
u32 features = dst_metric(dst, RTAX_FEATURES);
|
||||
if (mtu < IPV6_MIN_MTU)
|
||||
mtu = IPV6_MIN_MTU;
|
||||
features |= RTAX_FEATURE_ALLFRAG;
|
||||
dst_metric_set(dst, RTAX_FEATURES, features);
|
||||
}
|
||||
|
||||
dst_metric_set(dst, RTAX_MTU, mtu);
|
||||
rt6_update_expires(rt6, net->ipv6.sysctl.ip6_rt_mtu_expires);
|
||||
}
|
||||
|
|
@ -1245,12 +1242,16 @@ restart:
|
|||
rt = net->ipv6.ip6_null_entry;
|
||||
else if (rt->dst.error) {
|
||||
rt = net->ipv6.ip6_null_entry;
|
||||
} else if (rt == net->ipv6.ip6_null_entry) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (rt == net->ipv6.ip6_null_entry) {
|
||||
fn = fib6_backtrack(fn, &fl6->saddr);
|
||||
if (fn)
|
||||
goto restart;
|
||||
}
|
||||
|
||||
out:
|
||||
dst_hold(&rt->dst);
|
||||
|
||||
read_unlock_bh(&table->tb6_lock);
|
||||
|
|
|
|||
|
|
@ -130,12 +130,18 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse)
|
|||
{
|
||||
struct flowi6 *fl6 = &fl->u.ip6;
|
||||
int onlyproto = 0;
|
||||
u16 offset = skb_network_header_len(skb);
|
||||
const struct ipv6hdr *hdr = ipv6_hdr(skb);
|
||||
u16 offset = sizeof(*hdr);
|
||||
struct ipv6_opt_hdr *exthdr;
|
||||
const unsigned char *nh = skb_network_header(skb);
|
||||
u8 nexthdr = nh[IP6CB(skb)->nhoff];
|
||||
u16 nhoff = IP6CB(skb)->nhoff;
|
||||
int oif = 0;
|
||||
u8 nexthdr;
|
||||
|
||||
if (!nhoff)
|
||||
nhoff = offsetof(struct ipv6hdr, nexthdr);
|
||||
|
||||
nexthdr = nh[nhoff];
|
||||
|
||||
if (skb_dst(skb))
|
||||
oif = skb_dst(skb)->dev->ifindex;
|
||||
|
|
|
|||
Loading…
Reference in a new issue