mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (27 commits) vlan: allow nested vlan_do_receive() ipv6: fix route lookup in addrconf_prefix_rcv() bonding: eliminate bond_close race conditions qlcnic: fix beacon and LED test. qlcnic: Updated License file qlcnic: updated reset sequence qlcnic: reset loopback mode if promiscous mode setting fails. qlcnic: skip IDC ack check in fw reset path. i825xx: Fix incorrect dependency for BVME6000_NET ipv6: fix route error binding peer in func icmp6_dst_alloc ipv6: fix error propagation in ip6_ufo_append_data() stmmac: update normal descriptor structure (v2) stmmac: fix NULL pointer dereference in capabilities fixup (v2) stmmac: fix a bug while checking the HW cap reg (v2) be2net: Changing MAC Address of a VF was broken. be2net: Refactored be_cmds.c file. bnx2x: update driver version to 1.70.30-0 bnx2x: use FW 7.0.29.0 bnx2x: Enable changing speed when port type is PORT_DA bnx2x: Fix 54618se LED behavior ...
This commit is contained in:
commit
1a4ceab195
39 changed files with 634 additions and 567 deletions
|
|
@ -4,7 +4,7 @@
|
|||
#include <linux/netpoll.h>
|
||||
#include "vlan.h"
|
||||
|
||||
bool vlan_do_receive(struct sk_buff **skbp)
|
||||
bool vlan_do_receive(struct sk_buff **skbp, bool last_handler)
|
||||
{
|
||||
struct sk_buff *skb = *skbp;
|
||||
u16 vlan_id = skb->vlan_tci & VLAN_VID_MASK;
|
||||
|
|
@ -13,7 +13,10 @@ bool vlan_do_receive(struct sk_buff **skbp)
|
|||
|
||||
vlan_dev = vlan_find_dev(skb->dev, vlan_id);
|
||||
if (!vlan_dev) {
|
||||
if (vlan_id)
|
||||
/* Only the last call to vlan_do_receive() should change
|
||||
* pkt_type to PACKET_OTHERHOST
|
||||
*/
|
||||
if (vlan_id && last_handler)
|
||||
skb->pkt_type = PACKET_OTHERHOST;
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -137,10 +137,22 @@ static void tt_local_entry_free_ref(struct tt_local_entry *tt_local_entry)
|
|||
kfree_rcu(tt_local_entry, rcu);
|
||||
}
|
||||
|
||||
static void tt_global_entry_free_rcu(struct rcu_head *rcu)
|
||||
{
|
||||
struct tt_global_entry *tt_global_entry;
|
||||
|
||||
tt_global_entry = container_of(rcu, struct tt_global_entry, rcu);
|
||||
|
||||
if (tt_global_entry->orig_node)
|
||||
orig_node_free_ref(tt_global_entry->orig_node);
|
||||
|
||||
kfree(tt_global_entry);
|
||||
}
|
||||
|
||||
static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry)
|
||||
{
|
||||
if (atomic_dec_and_test(&tt_global_entry->refcount))
|
||||
kfree_rcu(tt_global_entry, rcu);
|
||||
call_rcu(&tt_global_entry->rcu, tt_global_entry_free_rcu);
|
||||
}
|
||||
|
||||
static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr,
|
||||
|
|
@ -710,6 +722,9 @@ void tt_global_del_orig(struct bat_priv *bat_priv,
|
|||
struct hlist_head *head;
|
||||
spinlock_t *list_lock; /* protects write access to the hash lists */
|
||||
|
||||
if (!hash)
|
||||
return;
|
||||
|
||||
for (i = 0; i < hash->size; i++) {
|
||||
head = &hash->table[i];
|
||||
list_lock = &hash->list_locks[i];
|
||||
|
|
|
|||
|
|
@ -224,22 +224,22 @@ struct socket_packet {
|
|||
|
||||
struct tt_local_entry {
|
||||
uint8_t addr[ETH_ALEN];
|
||||
struct hlist_node hash_entry;
|
||||
unsigned long last_seen;
|
||||
uint16_t flags;
|
||||
atomic_t refcount;
|
||||
struct rcu_head rcu;
|
||||
struct hlist_node hash_entry;
|
||||
};
|
||||
|
||||
struct tt_global_entry {
|
||||
uint8_t addr[ETH_ALEN];
|
||||
struct hlist_node hash_entry; /* entry in the global table */
|
||||
struct orig_node *orig_node;
|
||||
uint8_t ttvn;
|
||||
uint16_t flags; /* only TT_GLOBAL_ROAM is used */
|
||||
unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */
|
||||
atomic_t refcount;
|
||||
struct rcu_head rcu;
|
||||
struct hlist_node hash_entry; /* entry in the global table */
|
||||
};
|
||||
|
||||
struct tt_change_node {
|
||||
|
|
|
|||
|
|
@ -3283,18 +3283,18 @@ another_round:
|
|||
ncls:
|
||||
#endif
|
||||
|
||||
rx_handler = rcu_dereference(skb->dev->rx_handler);
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
if (pt_prev) {
|
||||
ret = deliver_skb(skb, pt_prev, orig_dev);
|
||||
pt_prev = NULL;
|
||||
}
|
||||
if (vlan_do_receive(&skb))
|
||||
if (vlan_do_receive(&skb, !rx_handler))
|
||||
goto another_round;
|
||||
else if (unlikely(!skb))
|
||||
goto out;
|
||||
}
|
||||
|
||||
rx_handler = rcu_dereference(skb->dev->rx_handler);
|
||||
if (rx_handler) {
|
||||
if (pt_prev) {
|
||||
ret = deliver_skb(skb, pt_prev, orig_dev);
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req,
|
|||
&ireq6->loc_addr,
|
||||
&ireq6->rmt_addr);
|
||||
ipv6_addr_copy(&fl6.daddr, &ireq6->rmt_addr);
|
||||
err = ip6_xmit(sk, skb, &fl6, opt);
|
||||
err = ip6_xmit(sk, skb, &fl6, opt, np->tclass);
|
||||
err = net_xmit_eval(err);
|
||||
}
|
||||
|
||||
|
|
@ -326,7 +326,7 @@ static void dccp_v6_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb)
|
|||
dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false);
|
||||
if (!IS_ERR(dst)) {
|
||||
skb_dst_set(skb, dst);
|
||||
ip6_xmit(ctl_sk, skb, &fl6, NULL);
|
||||
ip6_xmit(ctl_sk, skb, &fl6, NULL, 0);
|
||||
DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS);
|
||||
DCCP_INC_STATS_BH(DCCP_MIB_OUTRSTS);
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -345,6 +345,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)
|
|||
tw6 = inet6_twsk((struct sock *)tw);
|
||||
ipv6_addr_copy(&tw6->tw_v6_daddr, &np->daddr);
|
||||
ipv6_addr_copy(&tw6->tw_v6_rcv_saddr, &np->rcv_saddr);
|
||||
tw->tw_tclass = np->tclass;
|
||||
tw->tw_ipv6only = np->ipv6only;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1713,6 +1713,40 @@ addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev,
|
|||
ip6_route_add(&cfg);
|
||||
}
|
||||
|
||||
|
||||
static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
|
||||
int plen,
|
||||
const struct net_device *dev,
|
||||
u32 flags, u32 noflags)
|
||||
{
|
||||
struct fib6_node *fn;
|
||||
struct rt6_info *rt = NULL;
|
||||
struct fib6_table *table;
|
||||
|
||||
table = fib6_get_table(dev_net(dev), RT6_TABLE_PREFIX);
|
||||
if (table == NULL)
|
||||
return NULL;
|
||||
|
||||
write_lock_bh(&table->tb6_lock);
|
||||
fn = fib6_locate(&table->tb6_root, pfx, plen, NULL, 0);
|
||||
if (!fn)
|
||||
goto out;
|
||||
for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) {
|
||||
if (rt->rt6i_dev->ifindex != dev->ifindex)
|
||||
continue;
|
||||
if ((rt->rt6i_flags & flags) != flags)
|
||||
continue;
|
||||
if ((noflags != 0) && ((rt->rt6i_flags & flags) != 0))
|
||||
continue;
|
||||
dst_hold(&rt->dst);
|
||||
break;
|
||||
}
|
||||
out:
|
||||
write_unlock_bh(&table->tb6_lock);
|
||||
return rt;
|
||||
}
|
||||
|
||||
|
||||
/* Create "default" multicast route to the interface */
|
||||
|
||||
static void addrconf_add_mroute(struct net_device *dev)
|
||||
|
|
@ -1842,10 +1876,13 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len)
|
|||
if (addrconf_finite_timeout(rt_expires))
|
||||
rt_expires *= HZ;
|
||||
|
||||
rt = rt6_lookup(net, &pinfo->prefix, NULL,
|
||||
dev->ifindex, 1);
|
||||
rt = addrconf_get_prefix_route(&pinfo->prefix,
|
||||
pinfo->prefix_len,
|
||||
dev,
|
||||
RTF_ADDRCONF | RTF_PREFIX_RT,
|
||||
RTF_GATEWAY | RTF_DEFAULT);
|
||||
|
||||
if (rt && addrconf_is_prefix_route(rt)) {
|
||||
if (rt) {
|
||||
/* Autoconf prefix route */
|
||||
if (valid_lft == 0) {
|
||||
ip6_del_rt(rt);
|
||||
|
|
|
|||
|
|
@ -248,7 +248,7 @@ int inet6_csk_xmit(struct sk_buff *skb, struct flowi *fl_unused)
|
|||
/* Restore final destination back after routing done */
|
||||
ipv6_addr_copy(&fl6.daddr, &np->daddr);
|
||||
|
||||
res = ip6_xmit(sk, skb, &fl6, np->opt);
|
||||
res = ip6_xmit(sk, skb, &fl6, np->opt, np->tclass);
|
||||
rcu_read_unlock();
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -180,7 +180,7 @@ int ip6_output(struct sk_buff *skb)
|
|||
*/
|
||||
|
||||
int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
|
||||
struct ipv6_txoptions *opt)
|
||||
struct ipv6_txoptions *opt, int tclass)
|
||||
{
|
||||
struct net *net = sock_net(sk);
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
|
|
@ -190,7 +190,6 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
|
|||
u8 proto = fl6->flowi6_proto;
|
||||
int seg_len = skb->len;
|
||||
int hlimit = -1;
|
||||
int tclass = 0;
|
||||
u32 mtu;
|
||||
|
||||
if (opt) {
|
||||
|
|
@ -228,10 +227,8 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
|
|||
/*
|
||||
* Fill in the IPv6 header
|
||||
*/
|
||||
if (np) {
|
||||
tclass = np->tclass;
|
||||
if (np)
|
||||
hlimit = np->hop_limit;
|
||||
}
|
||||
if (hlimit < 0)
|
||||
hlimit = ip6_dst_hoplimit(dst);
|
||||
|
||||
|
|
@ -1126,7 +1123,7 @@ static inline int ip6_ufo_append_data(struct sock *sk,
|
|||
hh_len + fragheaderlen + transhdrlen + 20,
|
||||
(flags & MSG_DONTWAIT), &err);
|
||||
if (skb == NULL)
|
||||
return -ENOMEM;
|
||||
return err;
|
||||
|
||||
/* reserve space for Hardware header */
|
||||
skb_reserve(skb, hh_len);
|
||||
|
|
|
|||
|
|
@ -1086,11 +1086,10 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
|
|||
rt->dst.output = ip6_output;
|
||||
dst_set_neighbour(&rt->dst, neigh);
|
||||
atomic_set(&rt->dst.__refcnt, 1);
|
||||
dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255);
|
||||
|
||||
ipv6_addr_copy(&rt->rt6i_dst.addr, addr);
|
||||
rt->rt6i_dst.plen = 128;
|
||||
rt->rt6i_idev = idev;
|
||||
dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255);
|
||||
|
||||
spin_lock_bh(&icmp6_dst_lock);
|
||||
rt->dst.next = icmp6_dst_gc_list;
|
||||
|
|
|
|||
|
|
@ -513,7 +513,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
|
|||
__tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr);
|
||||
|
||||
ipv6_addr_copy(&fl6.daddr, &treq->rmt_addr);
|
||||
err = ip6_xmit(sk, skb, &fl6, opt);
|
||||
err = ip6_xmit(sk, skb, &fl6, opt, np->tclass);
|
||||
err = net_xmit_eval(err);
|
||||
}
|
||||
|
||||
|
|
@ -979,7 +979,7 @@ static int tcp6_gro_complete(struct sk_buff *skb)
|
|||
}
|
||||
|
||||
static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
|
||||
u32 ts, struct tcp_md5sig_key *key, int rst)
|
||||
u32 ts, struct tcp_md5sig_key *key, int rst, u8 tclass)
|
||||
{
|
||||
const struct tcphdr *th = tcp_hdr(skb);
|
||||
struct tcphdr *t1;
|
||||
|
|
@ -1060,7 +1060,7 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,
|
|||
dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false);
|
||||
if (!IS_ERR(dst)) {
|
||||
skb_dst_set(buff, dst);
|
||||
ip6_xmit(ctl_sk, buff, &fl6, NULL);
|
||||
ip6_xmit(ctl_sk, buff, &fl6, NULL, tclass);
|
||||
TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
|
||||
if (rst)
|
||||
TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS);
|
||||
|
|
@ -1093,13 +1093,13 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)
|
|||
ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -
|
||||
(th->doff << 2);
|
||||
|
||||
tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1);
|
||||
tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1, 0);
|
||||
}
|
||||
|
||||
static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts,
|
||||
struct tcp_md5sig_key *key)
|
||||
struct tcp_md5sig_key *key, u8 tclass)
|
||||
{
|
||||
tcp_v6_send_response(skb, seq, ack, win, ts, key, 0);
|
||||
tcp_v6_send_response(skb, seq, ack, win, ts, key, 0, tclass);
|
||||
}
|
||||
|
||||
static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
|
||||
|
|
@ -1109,7 +1109,8 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)
|
|||
|
||||
tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,
|
||||
tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale,
|
||||
tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw));
|
||||
tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw),
|
||||
tw->tw_tclass);
|
||||
|
||||
inet_twsk_put(tw);
|
||||
}
|
||||
|
|
@ -1118,7 +1119,7 @@ static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,
|
|||
struct request_sock *req)
|
||||
{
|
||||
tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent,
|
||||
tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr));
|
||||
tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr), 0);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -243,7 +243,7 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport)
|
|||
if (!(transport->param_flags & SPP_PMTUD_ENABLE))
|
||||
skb->local_df = 1;
|
||||
|
||||
return ip6_xmit(sk, skb, &fl6, np->opt);
|
||||
return ip6_xmit(sk, skb, &fl6, np->opt, np->tclass);
|
||||
}
|
||||
|
||||
/* Returns the dst cache entry for the given source and destination ip
|
||||
|
|
|
|||
Loading…
Reference in a new issue