mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c net/ipv6/ip6_tunnel.c net/ipv6/ip6_vti.c ipv6 tunnel statistic bug fixes conflicting with consolidation into generic sw per-cpu net stats. qlogic conflict between queue counting bug fix and the addition of multiple MAC address support. Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
commit
56a4342dfe
347 changed files with 3686 additions and 1780 deletions
|
|
@ -1677,7 +1677,7 @@ void addrconf_leave_solict(struct inet6_dev *idev, const struct in6_addr *addr)
|
|||
static void addrconf_join_anycast(struct inet6_ifaddr *ifp)
|
||||
{
|
||||
struct in6_addr addr;
|
||||
if (ifp->prefix_len == 127) /* RFC 6164 */
|
||||
if (ifp->prefix_len >= 127) /* RFC 6164 */
|
||||
return;
|
||||
ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
|
||||
if (ipv6_addr_any(&addr))
|
||||
|
|
@ -1688,7 +1688,7 @@ static void addrconf_join_anycast(struct inet6_ifaddr *ifp)
|
|||
static void addrconf_leave_anycast(struct inet6_ifaddr *ifp)
|
||||
{
|
||||
struct in6_addr addr;
|
||||
if (ifp->prefix_len == 127) /* RFC 6164 */
|
||||
if (ifp->prefix_len >= 127) /* RFC 6164 */
|
||||
return;
|
||||
ipv6_addr_prefix(&addr, &ifp->addr, ifp->prefix_len);
|
||||
if (ipv6_addr_any(&addr))
|
||||
|
|
@ -3476,7 +3476,12 @@ restart:
|
|||
&inet6_addr_lst[i], addr_lst) {
|
||||
unsigned long age;
|
||||
|
||||
if (ifp->flags & IFA_F_PERMANENT)
|
||||
/* When setting preferred_lft to a value not zero or
|
||||
* infinity, while valid_lft is infinity
|
||||
* IFA_F_PERMANENT has a non-infinity life time.
|
||||
*/
|
||||
if ((ifp->flags & IFA_F_PERMANENT) &&
|
||||
(ifp->prefered_lft == INFINITY_LIFE_TIME))
|
||||
continue;
|
||||
|
||||
spin_lock(&ifp->lock);
|
||||
|
|
@ -3501,7 +3506,8 @@ restart:
|
|||
ifp->flags |= IFA_F_DEPRECATED;
|
||||
}
|
||||
|
||||
if (time_before(ifp->tstamp + ifp->valid_lft * HZ, next))
|
||||
if ((ifp->valid_lft != INFINITY_LIFE_TIME) &&
|
||||
(time_before(ifp->tstamp + ifp->valid_lft * HZ, next)))
|
||||
next = ifp->tstamp + ifp->valid_lft * HZ;
|
||||
|
||||
spin_unlock(&ifp->lock);
|
||||
|
|
@ -3801,7 +3807,8 @@ static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,
|
|||
put_ifaddrmsg(nlh, ifa->prefix_len, ifa->flags, rt_scope(ifa->scope),
|
||||
ifa->idev->dev->ifindex);
|
||||
|
||||
if (!(ifa->flags&IFA_F_PERMANENT)) {
|
||||
if (!((ifa->flags&IFA_F_PERMANENT) &&
|
||||
(ifa->prefered_lft == INFINITY_LIFE_TIME))) {
|
||||
preferred = ifa->prefered_lft;
|
||||
valid = ifa->valid_lft;
|
||||
if (preferred != INFINITY_LIFE_TIME) {
|
||||
|
|
|
|||
|
|
@ -1188,11 +1188,35 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|||
|
||||
fragheaderlen = sizeof(struct ipv6hdr) + rt->rt6i_nfheader_len +
|
||||
(opt ? opt->opt_nflen : 0);
|
||||
maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen - sizeof(struct frag_hdr);
|
||||
maxfraglen = ((mtu - fragheaderlen) & ~7) + fragheaderlen -
|
||||
sizeof(struct frag_hdr);
|
||||
|
||||
if (mtu <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) {
|
||||
if (cork->length + length > sizeof(struct ipv6hdr) + IPV6_MAXPLEN - fragheaderlen) {
|
||||
ipv6_local_error(sk, EMSGSIZE, fl6, mtu-exthdrlen);
|
||||
unsigned int maxnonfragsize, headersize;
|
||||
|
||||
headersize = sizeof(struct ipv6hdr) +
|
||||
(opt ? opt->tot_len : 0) +
|
||||
(dst_allfrag(&rt->dst) ?
|
||||
sizeof(struct frag_hdr) : 0) +
|
||||
rt->rt6i_nfheader_len;
|
||||
|
||||
maxnonfragsize = (np->pmtudisc >= IPV6_PMTUDISC_DO) ?
|
||||
mtu : sizeof(struct ipv6hdr) + IPV6_MAXPLEN;
|
||||
|
||||
/* dontfrag active */
|
||||
if ((cork->length + length > mtu - headersize) && dontfrag &&
|
||||
(sk->sk_protocol == IPPROTO_UDP ||
|
||||
sk->sk_protocol == IPPROTO_RAW)) {
|
||||
ipv6_local_rxpmtu(sk, fl6, mtu - headersize +
|
||||
sizeof(struct ipv6hdr));
|
||||
goto emsgsize;
|
||||
}
|
||||
|
||||
if (cork->length + length > maxnonfragsize - headersize) {
|
||||
emsgsize:
|
||||
ipv6_local_error(sk, EMSGSIZE, fl6,
|
||||
mtu - headersize +
|
||||
sizeof(struct ipv6hdr));
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
}
|
||||
|
|
@ -1217,12 +1241,6 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|||
* --yoshfuji
|
||||
*/
|
||||
|
||||
if ((length > mtu) && dontfrag && (sk->sk_protocol == IPPROTO_UDP ||
|
||||
sk->sk_protocol == IPPROTO_RAW)) {
|
||||
ipv6_local_rxpmtu(sk, fl6, mtu-exthdrlen);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
skb = skb_peek_tail(&sk->sk_write_queue);
|
||||
cork->length += length;
|
||||
if (((length > mtu) ||
|
||||
|
|
|
|||
|
|
@ -101,17 +101,26 @@ struct ip6_tnl_net {
|
|||
|
||||
static struct net_device_stats *ip6_get_stats(struct net_device *dev)
|
||||
{
|
||||
struct pcpu_sw_netstats sum = { 0 };
|
||||
struct pcpu_sw_netstats tmp, sum = { 0 };
|
||||
int i;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
unsigned int start;
|
||||
const struct pcpu_sw_netstats *tstats =
|
||||
per_cpu_ptr(dev->tstats, i);
|
||||
|
||||
sum.rx_packets += tstats->rx_packets;
|
||||
sum.rx_bytes += tstats->rx_bytes;
|
||||
sum.tx_packets += tstats->tx_packets;
|
||||
sum.tx_bytes += tstats->tx_bytes;
|
||||
do {
|
||||
start = u64_stats_fetch_begin_bh(&tstats->syncp);
|
||||
tmp.rx_packets = tstats->rx_packets;
|
||||
tmp.rx_bytes = tstats->rx_bytes;
|
||||
tmp.tx_packets = tstats->tx_packets;
|
||||
tmp.tx_bytes = tstats->tx_bytes;
|
||||
} while (u64_stats_fetch_retry_bh(&tstats->syncp, start));
|
||||
|
||||
sum.rx_packets += tmp.rx_packets;
|
||||
sum.rx_bytes += tmp.rx_bytes;
|
||||
sum.tx_packets += tmp.tx_packets;
|
||||
sum.tx_bytes += tmp.tx_bytes;
|
||||
}
|
||||
dev->stats.rx_packets = sum.rx_packets;
|
||||
dev->stats.rx_bytes = sum.rx_bytes;
|
||||
|
|
@ -823,8 +832,10 @@ static int ip6_tnl_rcv(struct sk_buff *skb, __u16 protocol,
|
|||
}
|
||||
|
||||
tstats = this_cpu_ptr(t->dev->tstats);
|
||||
u64_stats_update_begin(&tstats->syncp);
|
||||
tstats->rx_packets++;
|
||||
tstats->rx_bytes += skb->len;
|
||||
u64_stats_update_end(&tstats->syncp);
|
||||
|
||||
netif_rx(skb);
|
||||
|
||||
|
|
|
|||
|
|
@ -74,27 +74,6 @@ struct vti6_net {
|
|||
struct ip6_tnl __rcu **tnls[2];
|
||||
};
|
||||
|
||||
static struct net_device_stats *vti6_get_stats(struct net_device *dev)
|
||||
{
|
||||
struct pcpu_sw_netstats sum = { 0 };
|
||||
int i;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
const struct pcpu_sw_netstats *tstats =
|
||||
per_cpu_ptr(dev->tstats, i);
|
||||
|
||||
sum.rx_packets += tstats->rx_packets;
|
||||
sum.rx_bytes += tstats->rx_bytes;
|
||||
sum.tx_packets += tstats->tx_packets;
|
||||
sum.tx_bytes += tstats->tx_bytes;
|
||||
}
|
||||
dev->stats.rx_packets = sum.rx_packets;
|
||||
dev->stats.rx_bytes = sum.rx_bytes;
|
||||
dev->stats.tx_packets = sum.tx_packets;
|
||||
dev->stats.tx_bytes = sum.tx_bytes;
|
||||
return &dev->stats;
|
||||
}
|
||||
|
||||
#define for_each_vti6_tunnel_rcu(start) \
|
||||
for (t = rcu_dereference(start); t; t = rcu_dereference(t->next))
|
||||
|
||||
|
|
@ -331,8 +310,10 @@ static int vti6_rcv(struct sk_buff *skb)
|
|||
}
|
||||
|
||||
tstats = this_cpu_ptr(t->dev->tstats);
|
||||
u64_stats_update_begin(&tstats->syncp);
|
||||
tstats->rx_packets++;
|
||||
tstats->rx_bytes += skb->len;
|
||||
u64_stats_update_end(&tstats->syncp);
|
||||
|
||||
skb->mark = 0;
|
||||
secpath_reset(skb);
|
||||
|
|
@ -716,7 +697,7 @@ static const struct net_device_ops vti6_netdev_ops = {
|
|||
.ndo_start_xmit = vti6_tnl_xmit,
|
||||
.ndo_do_ioctl = vti6_ioctl,
|
||||
.ndo_change_mtu = vti6_change_mtu,
|
||||
.ndo_get_stats = vti6_get_stats,
|
||||
.ndo_get_stats64 = ip_tunnel_get_stats64,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1923,9 +1923,7 @@ static struct rt6_info *ip6_rt_copy(struct rt6_info *ort,
|
|||
else
|
||||
rt->rt6i_gateway = *dest;
|
||||
rt->rt6i_flags = ort->rt6i_flags;
|
||||
if ((ort->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) ==
|
||||
(RTF_DEFAULT | RTF_ADDRCONF))
|
||||
rt6_set_from(rt, ort);
|
||||
rt6_set_from(rt, ort);
|
||||
rt->rt6i_metric = 0;
|
||||
|
||||
#ifdef CONFIG_IPV6_SUBTREES
|
||||
|
|
|
|||
|
|
@ -702,8 +702,10 @@ static int ipip6_rcv(struct sk_buff *skb)
|
|||
}
|
||||
|
||||
tstats = this_cpu_ptr(tunnel->dev->tstats);
|
||||
u64_stats_update_begin(&tstats->syncp);
|
||||
tstats->rx_packets++;
|
||||
tstats->rx_bytes += skb->len;
|
||||
u64_stats_update_end(&tstats->syncp);
|
||||
|
||||
netif_rx(skb);
|
||||
|
||||
|
|
@ -924,7 +926,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
|
|||
if (tunnel->parms.iph.daddr && skb_dst(skb))
|
||||
skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu);
|
||||
|
||||
if (skb->len > mtu) {
|
||||
if (skb->len > mtu && !skb_is_gso(skb)) {
|
||||
icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, mtu);
|
||||
ip_rt_put(rt);
|
||||
goto tx_error;
|
||||
|
|
@ -966,8 +968,10 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
|
|||
tos = INET_ECN_encapsulate(tos, ipv6_get_dsfield(iph6));
|
||||
|
||||
skb = iptunnel_handle_offloads(skb, false, SKB_GSO_SIT);
|
||||
if (IS_ERR(skb))
|
||||
if (IS_ERR(skb)) {
|
||||
ip_rt_put(rt);
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = iptunnel_xmit(rt, skb, fl4.saddr, fl4.daddr, IPPROTO_IPV6, tos,
|
||||
ttl, df, !net_eq(tunnel->net, dev_net(dev)));
|
||||
|
|
|
|||
Loading…
Reference in a new issue