Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/team/team.c drivers/net/usb/qmi_wwan.c net/batman-adv/bat_iv_ogm.c net/ipv4/fib_frontend.c net/ipv4/route.c net/l2tp/l2tp_netlink.c The team, fib_frontend, route, and l2tp_netlink conflicts were simply overlapping changes. qmi_wwan and bat_iv_ogm were of the "use HEAD" variety. With help from Antonio Quartulli. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -175,33 +175,12 @@ void __inet6_csk_dst_store(struct sock *sk, struct dst_entry *dst,
|
||||
const struct in6_addr *saddr)
|
||||
{
|
||||
__ip6_dst_store(sk, dst, daddr, saddr);
|
||||
|
||||
#ifdef CONFIG_XFRM
|
||||
{
|
||||
struct rt6_info *rt = (struct rt6_info *)dst;
|
||||
rt->rt6i_flow_cache_genid = atomic_read(&flow_cache_genid);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline
|
||||
struct dst_entry *__inet6_csk_dst_check(struct sock *sk, u32 cookie)
|
||||
{
|
||||
struct dst_entry *dst;
|
||||
|
||||
dst = __sk_dst_check(sk, cookie);
|
||||
|
||||
#ifdef CONFIG_XFRM
|
||||
if (dst) {
|
||||
struct rt6_info *rt = (struct rt6_info *)dst;
|
||||
if (rt->rt6i_flow_cache_genid != atomic_read(&flow_cache_genid)) {
|
||||
__sk_dst_reset(sk);
|
||||
dst = NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return dst;
|
||||
return __sk_dst_check(sk, cookie);
|
||||
}
|
||||
|
||||
static struct dst_entry *inet6_csk_route_socket(struct sock *sk,
|
||||
|
@@ -819,6 +819,10 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info)
|
||||
offsetof(struct rt6_info, rt6i_src),
|
||||
allow_create, replace_required);
|
||||
|
||||
if (IS_ERR(sn)) {
|
||||
err = PTR_ERR(sn);
|
||||
sn = NULL;
|
||||
}
|
||||
if (!sn) {
|
||||
/* If it is failed, discard just allocated
|
||||
root, and then (in st_failure) stale node
|
||||
|
@@ -86,28 +86,30 @@ static int mip6_mh_len(int type)
|
||||
|
||||
static int mip6_mh_filter(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct ip6_mh *mh;
|
||||
struct ip6_mh _hdr;
|
||||
const struct ip6_mh *mh;
|
||||
|
||||
if (!pskb_may_pull(skb, (skb_transport_offset(skb)) + 8) ||
|
||||
!pskb_may_pull(skb, (skb_transport_offset(skb) +
|
||||
((skb_transport_header(skb)[1] + 1) << 3))))
|
||||
mh = skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
sizeof(_hdr), &_hdr);
|
||||
if (!mh)
|
||||
return -1;
|
||||
|
||||
mh = (struct ip6_mh *)skb_transport_header(skb);
|
||||
if (((mh->ip6mh_hdrlen + 1) << 3) > skb->len)
|
||||
return -1;
|
||||
|
||||
if (mh->ip6mh_hdrlen < mip6_mh_len(mh->ip6mh_type)) {
|
||||
LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH message too short: %d vs >=%d\n",
|
||||
mh->ip6mh_hdrlen, mip6_mh_len(mh->ip6mh_type));
|
||||
mip6_param_prob(skb, 0, ((&mh->ip6mh_hdrlen) -
|
||||
skb_network_header(skb)));
|
||||
mip6_param_prob(skb, 0, offsetof(struct ip6_mh, ip6mh_hdrlen) +
|
||||
skb_network_header_len(skb));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (mh->ip6mh_proto != IPPROTO_NONE) {
|
||||
LIMIT_NETDEBUG(KERN_DEBUG "mip6: MH invalid payload proto = %d\n",
|
||||
mh->ip6mh_proto);
|
||||
mip6_param_prob(skb, 0, ((&mh->ip6mh_proto) -
|
||||
skb_network_header(skb)));
|
||||
mip6_param_prob(skb, 0, offsetof(struct ip6_mh, ip6mh_proto) +
|
||||
skb_network_header_len(skb));
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@@ -107,21 +107,20 @@ found:
|
||||
* 0 - deliver
|
||||
* 1 - block
|
||||
*/
|
||||
static __inline__ int icmpv6_filter(struct sock *sk, struct sk_buff *skb)
|
||||
static int icmpv6_filter(const struct sock *sk, const struct sk_buff *skb)
|
||||
{
|
||||
struct icmp6hdr *icmph;
|
||||
struct raw6_sock *rp = raw6_sk(sk);
|
||||
struct icmp6hdr *_hdr;
|
||||
const struct icmp6hdr *hdr;
|
||||
|
||||
if (pskb_may_pull(skb, sizeof(struct icmp6hdr))) {
|
||||
__u32 *data = &rp->filter.data[0];
|
||||
int bit_nr;
|
||||
hdr = skb_header_pointer(skb, skb_transport_offset(skb),
|
||||
sizeof(_hdr), &_hdr);
|
||||
if (hdr) {
|
||||
const __u32 *data = &raw6_sk(sk)->filter.data[0];
|
||||
unsigned int type = hdr->icmp6_type;
|
||||
|
||||
icmph = (struct icmp6hdr *) skb->data;
|
||||
bit_nr = icmph->icmp6_type;
|
||||
|
||||
return (data[bit_nr >> 5] & (1 << (bit_nr & 31))) != 0;
|
||||
return (data[type >> 5] & (1U << (type & 31))) != 0;
|
||||
}
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE)
|
||||
|
@@ -226,7 +226,7 @@ static const struct rt6_info ip6_null_entry_template = {
|
||||
.dst = {
|
||||
.__refcnt = ATOMIC_INIT(1),
|
||||
.__use = 1,
|
||||
.obsolete = -1,
|
||||
.obsolete = DST_OBSOLETE_FORCE_CHK,
|
||||
.error = -ENETUNREACH,
|
||||
.input = ip6_pkt_discard,
|
||||
.output = ip6_pkt_discard_out,
|
||||
@@ -246,7 +246,7 @@ static const struct rt6_info ip6_prohibit_entry_template = {
|
||||
.dst = {
|
||||
.__refcnt = ATOMIC_INIT(1),
|
||||
.__use = 1,
|
||||
.obsolete = -1,
|
||||
.obsolete = DST_OBSOLETE_FORCE_CHK,
|
||||
.error = -EACCES,
|
||||
.input = ip6_pkt_prohibit,
|
||||
.output = ip6_pkt_prohibit_out,
|
||||
@@ -261,7 +261,7 @@ static const struct rt6_info ip6_blk_hole_entry_template = {
|
||||
.dst = {
|
||||
.__refcnt = ATOMIC_INIT(1),
|
||||
.__use = 1,
|
||||
.obsolete = -1,
|
||||
.obsolete = DST_OBSOLETE_FORCE_CHK,
|
||||
.error = -EINVAL,
|
||||
.input = dst_discard,
|
||||
.output = dst_discard,
|
||||
@@ -281,13 +281,14 @@ static inline struct rt6_info *ip6_dst_alloc(struct net *net,
|
||||
struct fib6_table *table)
|
||||
{
|
||||
struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev,
|
||||
0, DST_OBSOLETE_NONE, flags);
|
||||
0, DST_OBSOLETE_FORCE_CHK, flags);
|
||||
|
||||
if (rt) {
|
||||
struct dst_entry *dst = &rt->dst;
|
||||
|
||||
memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst));
|
||||
rt6_init_peer(rt, table ? &table->tb6_peers : net->ipv6.peers);
|
||||
rt->rt6i_genid = rt_genid(net);
|
||||
}
|
||||
return rt;
|
||||
}
|
||||
@@ -1022,6 +1023,13 @@ static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie)
|
||||
|
||||
rt = (struct rt6_info *) dst;
|
||||
|
||||
/* All IPV6 dsts are created with ->obsolete set to the value
|
||||
* DST_OBSOLETE_FORCE_CHK which forces validation calls down
|
||||
* into this function always.
|
||||
*/
|
||||
if (rt->rt6i_genid != rt_genid(dev_net(rt->dst.dev)))
|
||||
return NULL;
|
||||
|
||||
if (rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie)) {
|
||||
if (rt->rt6i_peer_genid != rt6_peer_genid()) {
|
||||
if (!rt6_has_peer(rt))
|
||||
@@ -1388,8 +1396,6 @@ int ip6_route_add(struct fib6_config *cfg)
|
||||
goto out;
|
||||
}
|
||||
|
||||
rt->dst.obsolete = -1;
|
||||
|
||||
if (cfg->fc_flags & RTF_EXPIRES)
|
||||
rt6_set_expires(rt, jiffies +
|
||||
clock_t_to_jiffies(cfg->fc_expires));
|
||||
@@ -2084,7 +2090,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
|
||||
rt->dst.input = ip6_input;
|
||||
rt->dst.output = ip6_output;
|
||||
rt->rt6i_idev = idev;
|
||||
rt->dst.obsolete = -1;
|
||||
|
||||
rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP;
|
||||
if (anycast)
|
||||
|
Reference in New Issue
Block a user