mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (51 commits) netfilter: ipset: Fix the order of listing of sets ip6_pol_route panic: Do not allow VLAN on loopback bnx2x: Fix port identification problem r8169: add Realtek as maintainer. ip: ip_options_compile() resilient to NULL skb route bna: fix memory leak during RX path cleanup bna: fix for clean fw re-initialization usbnet: Fix up 'FLAG_POINTTOPOINT' and 'FLAG_MULTI_PACKET' overlaps. iwlegacy: fix tx_power initialization Revert "tcp: disallow bind() to reuse addr/port" qlcnic: limit skb frags for non tso packet net: can: mscan: fix build breakage in mpc5xxx_can netfilter: ipset: set match and SET target fixes netfilter: ipset: bitmap:ip,mac type requires "src" for MAC sctp: fix oops while removed transport still using as retran path sctp: fix oops when updating retransmit path with DEBUG on net: Disable NETIF_F_TSO_ECN when TSO is disabled net: Disable all TSO features when SG is disabled sfc: Use rmb() to ensure reads occur in order ieee802154: Remove hacked CFLAGS in net/ieee802154/Makefile ...
This commit is contained in:
commit
6cf544377f
64 changed files with 330 additions and 203 deletions
|
|
@ -249,11 +249,9 @@ static int br_parse_ip_options(struct sk_buff *skb)
|
|||
goto drop;
|
||||
}
|
||||
|
||||
/* Zero out the CB buffer if no options present */
|
||||
if (iph->ihl == 5) {
|
||||
memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
|
||||
memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
|
||||
if (iph->ihl == 5)
|
||||
return 0;
|
||||
}
|
||||
|
||||
opt->optlen = iph->ihl*4 - sizeof(struct iphdr);
|
||||
if (ip_options_compile(dev_net(dev), opt, skb))
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
#include <net/caif/cfsrvl.h>
|
||||
#include <net/caif/cfpkt.h>
|
||||
|
||||
|
||||
#define container_obj(layr) ((struct cfsrvl *) layr)
|
||||
|
||||
#define DGM_CMD_BIT 0x80
|
||||
|
|
@ -83,6 +84,7 @@ static int cfdgml_receive(struct cflayer *layr, struct cfpkt *pkt)
|
|||
|
||||
static int cfdgml_transmit(struct cflayer *layr, struct cfpkt *pkt)
|
||||
{
|
||||
u8 packet_type;
|
||||
u32 zero = 0;
|
||||
struct caif_payload_info *info;
|
||||
struct cfsrvl *service = container_obj(layr);
|
||||
|
|
@ -94,7 +96,9 @@ static int cfdgml_transmit(struct cflayer *layr, struct cfpkt *pkt)
|
|||
if (cfpkt_getlen(pkt) > DGM_MTU)
|
||||
return -EMSGSIZE;
|
||||
|
||||
cfpkt_add_head(pkt, &zero, 4);
|
||||
cfpkt_add_head(pkt, &zero, 3);
|
||||
packet_type = 0x08; /* B9 set - UNCLASSIFIED */
|
||||
cfpkt_add_head(pkt, &packet_type, 1);
|
||||
|
||||
/* Add info for MUX-layer to route the packet out. */
|
||||
info = cfpkt_info(pkt);
|
||||
|
|
|
|||
|
|
@ -244,9 +244,9 @@ static void cfmuxl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
|
|||
int phyid)
|
||||
{
|
||||
struct cfmuxl *muxl = container_obj(layr);
|
||||
struct list_head *node;
|
||||
struct list_head *node, *next;
|
||||
struct cflayer *layer;
|
||||
list_for_each(node, &muxl->srvl_list) {
|
||||
list_for_each_safe(node, next, &muxl->srvl_list) {
|
||||
layer = list_entry(node, struct cflayer, node);
|
||||
if (cfsrvl_phyid_match(layer, phyid))
|
||||
layer->ctrlcmd(layer, ctrl, phyid);
|
||||
|
|
|
|||
|
|
@ -5203,11 +5203,15 @@ u32 netdev_fix_features(struct net_device *dev, u32 features)
|
|||
}
|
||||
|
||||
/* TSO requires that SG is present as well. */
|
||||
if ((features & NETIF_F_TSO) && !(features & NETIF_F_SG)) {
|
||||
netdev_info(dev, "Dropping NETIF_F_TSO since no SG feature.\n");
|
||||
features &= ~NETIF_F_TSO;
|
||||
if ((features & NETIF_F_ALL_TSO) && !(features & NETIF_F_SG)) {
|
||||
netdev_info(dev, "Dropping TSO features since no SG feature.\n");
|
||||
features &= ~NETIF_F_ALL_TSO;
|
||||
}
|
||||
|
||||
/* TSO ECN requires that TSO is present as well. */
|
||||
if ((features & NETIF_F_ALL_TSO) == NETIF_F_TSO_ECN)
|
||||
features &= ~NETIF_F_TSO_ECN;
|
||||
|
||||
/* Software GSO depends on SG. */
|
||||
if ((features & NETIF_F_GSO) && !(features & NETIF_F_SG)) {
|
||||
netdev_info(dev, "Dropping NETIF_F_GSO since no SG feature.\n");
|
||||
|
|
|
|||
|
|
@ -1,5 +1,3 @@
|
|||
obj-$(CONFIG_IEEE802154) += ieee802154.o af_802154.o
|
||||
ieee802154-y := netlink.o nl-mac.o nl-phy.o nl_policy.o wpan-class.o
|
||||
af_802154-y := af_ieee802154.o raw.o dgram.o
|
||||
|
||||
ccflags-y += -Wall -DDEBUG
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ int inet_csk_bind_conflict(const struct sock *sk,
|
|||
!sk2->sk_bound_dev_if ||
|
||||
sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) {
|
||||
if (!reuse || !sk2->sk_reuse ||
|
||||
((1 << sk2->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))) {
|
||||
sk2->sk_state == TCP_LISTEN) {
|
||||
const __be32 sk2_rcv_saddr = sk_rcv_saddr(sk2);
|
||||
if (!sk2_rcv_saddr || !sk_rcv_saddr(sk) ||
|
||||
sk2_rcv_saddr == sk_rcv_saddr(sk))
|
||||
|
|
@ -122,8 +122,7 @@ again:
|
|||
(tb->num_owners < smallest_size || smallest_size == -1)) {
|
||||
smallest_size = tb->num_owners;
|
||||
smallest_rover = rover;
|
||||
if (atomic_read(&hashinfo->bsockets) > (high - low) + 1 &&
|
||||
!inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb)) {
|
||||
if (atomic_read(&hashinfo->bsockets) > (high - low) + 1) {
|
||||
spin_unlock(&head->lock);
|
||||
snum = smallest_rover;
|
||||
goto have_snum;
|
||||
|
|
|
|||
|
|
@ -354,7 +354,8 @@ static void inetpeer_free_rcu(struct rcu_head *head)
|
|||
}
|
||||
|
||||
/* May be called with local BH enabled. */
|
||||
static void unlink_from_pool(struct inet_peer *p, struct inet_peer_base *base)
|
||||
static void unlink_from_pool(struct inet_peer *p, struct inet_peer_base *base,
|
||||
struct inet_peer __rcu **stack[PEER_MAXDEPTH])
|
||||
{
|
||||
int do_free;
|
||||
|
||||
|
|
@ -368,7 +369,6 @@ static void unlink_from_pool(struct inet_peer *p, struct inet_peer_base *base)
|
|||
* We use refcnt=-1 to alert lockless readers this entry is deleted.
|
||||
*/
|
||||
if (atomic_cmpxchg(&p->refcnt, 1, -1) == 1) {
|
||||
struct inet_peer __rcu **stack[PEER_MAXDEPTH];
|
||||
struct inet_peer __rcu ***stackptr, ***delp;
|
||||
if (lookup(&p->daddr, stack, base) != p)
|
||||
BUG();
|
||||
|
|
@ -422,7 +422,7 @@ static struct inet_peer_base *peer_to_base(struct inet_peer *p)
|
|||
}
|
||||
|
||||
/* May be called with local BH enabled. */
|
||||
static int cleanup_once(unsigned long ttl)
|
||||
static int cleanup_once(unsigned long ttl, struct inet_peer __rcu **stack[PEER_MAXDEPTH])
|
||||
{
|
||||
struct inet_peer *p = NULL;
|
||||
|
||||
|
|
@ -454,7 +454,7 @@ static int cleanup_once(unsigned long ttl)
|
|||
* happen because of entry limits in route cache. */
|
||||
return -1;
|
||||
|
||||
unlink_from_pool(p, peer_to_base(p));
|
||||
unlink_from_pool(p, peer_to_base(p), stack);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -524,7 +524,7 @@ struct inet_peer *inet_getpeer(struct inetpeer_addr *daddr, int create)
|
|||
|
||||
if (base->total >= inet_peer_threshold)
|
||||
/* Remove one less-recently-used entry. */
|
||||
cleanup_once(0);
|
||||
cleanup_once(0, stack);
|
||||
|
||||
return p;
|
||||
}
|
||||
|
|
@ -540,6 +540,7 @@ static void peer_check_expire(unsigned long dummy)
|
|||
{
|
||||
unsigned long now = jiffies;
|
||||
int ttl, total;
|
||||
struct inet_peer __rcu **stack[PEER_MAXDEPTH];
|
||||
|
||||
total = compute_total();
|
||||
if (total >= inet_peer_threshold)
|
||||
|
|
@ -548,7 +549,7 @@ static void peer_check_expire(unsigned long dummy)
|
|||
ttl = inet_peer_maxttl
|
||||
- (inet_peer_maxttl - inet_peer_minttl) / HZ *
|
||||
total / inet_peer_threshold * HZ;
|
||||
while (!cleanup_once(ttl)) {
|
||||
while (!cleanup_once(ttl, stack)) {
|
||||
if (jiffies != now)
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -329,7 +329,7 @@ int ip_options_compile(struct net *net,
|
|||
pp_ptr = optptr + 2;
|
||||
goto error;
|
||||
}
|
||||
if (skb) {
|
||||
if (rt) {
|
||||
memcpy(&optptr[optptr[2]-1], &rt->rt_spec_dst, 4);
|
||||
opt->is_changed = 1;
|
||||
}
|
||||
|
|
@ -371,7 +371,7 @@ int ip_options_compile(struct net *net,
|
|||
goto error;
|
||||
}
|
||||
opt->ts = optptr - iph;
|
||||
if (skb) {
|
||||
if (rt) {
|
||||
memcpy(&optptr[optptr[2]-1], &rt->rt_spec_dst, 4);
|
||||
timeptr = (__be32*)&optptr[optptr[2]+3];
|
||||
}
|
||||
|
|
@ -603,7 +603,7 @@ int ip_options_rcv_srr(struct sk_buff *skb)
|
|||
unsigned long orefdst;
|
||||
int err;
|
||||
|
||||
if (!opt->srr)
|
||||
if (!opt->srr || !rt)
|
||||
return 0;
|
||||
|
||||
if (skb->pkt_type != PACKET_HOST)
|
||||
|
|
|
|||
|
|
@ -311,7 +311,6 @@ static struct ctl_table ipv4_table[] = {
|
|||
.mode = 0644,
|
||||
.proc_handler = proc_do_large_bitmap,
|
||||
},
|
||||
#ifdef CONFIG_IP_MULTICAST
|
||||
{
|
||||
.procname = "igmp_max_memberships",
|
||||
.data = &sysctl_igmp_max_memberships,
|
||||
|
|
@ -319,8 +318,6 @@ static struct ctl_table ipv4_table[] = {
|
|||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec
|
||||
},
|
||||
|
||||
#endif
|
||||
{
|
||||
.procname = "igmp_max_msf",
|
||||
.data = &sysctl_igmp_max_msf,
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ int inet6_csk_bind_conflict(const struct sock *sk,
|
|||
!sk2->sk_bound_dev_if ||
|
||||
sk->sk_bound_dev_if == sk2->sk_bound_dev_if) &&
|
||||
(!sk->sk_reuse || !sk2->sk_reuse ||
|
||||
((1 << sk2->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))) &&
|
||||
sk2->sk_state == TCP_LISTEN) &&
|
||||
ipv6_rcv_saddr_equal(sk, sk2))
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1297,8 +1297,7 @@ static int irda_sendmsg(struct kiocb *iocb, struct socket *sock,
|
|||
/* Note : socket.c set MSG_EOR on SEQPACKET sockets */
|
||||
if (msg->msg_flags & ~(MSG_DONTWAIT | MSG_EOR | MSG_CMSG_COMPAT |
|
||||
MSG_NOSIGNAL)) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
lock_sock(sk);
|
||||
|
|
|
|||
|
|
@ -121,8 +121,7 @@ static inline int llc_fixup_skb(struct sk_buff *skb)
|
|||
s32 data_size = ntohs(pdulen) - llc_len;
|
||||
|
||||
if (data_size < 0 ||
|
||||
((skb_tail_pointer(skb) -
|
||||
(u8 *)pdu) - llc_len) < data_size)
|
||||
!pskb_may_pull(skb, data_size))
|
||||
return 0;
|
||||
if (unlikely(pskb_trim_rcsum(skb, data_size)))
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -343,6 +343,10 @@ bitmap_ipmac_kadt(struct ip_set *set, const struct sk_buff *skb,
|
|||
ipset_adtfn adtfn = set->variant->adt[adt];
|
||||
struct ipmac data;
|
||||
|
||||
/* MAC can be src only */
|
||||
if (!(flags & IPSET_DIM_TWO_SRC))
|
||||
return 0;
|
||||
|
||||
data.id = ntohl(ip4addr(skb, flags & IPSET_DIM_ONE_SRC));
|
||||
if (data.id < map->first_ip || data.id > map->last_ip)
|
||||
return -IPSET_ERR_BITMAP_RANGE;
|
||||
|
|
|
|||
|
|
@ -1022,8 +1022,9 @@ ip_set_dump_start(struct sk_buff *skb, struct netlink_callback *cb)
|
|||
if (cb->args[1] >= ip_set_max)
|
||||
goto out;
|
||||
|
||||
pr_debug("args[0]: %ld args[1]: %ld\n", cb->args[0], cb->args[1]);
|
||||
max = cb->args[0] == DUMP_ONE ? cb->args[1] + 1 : ip_set_max;
|
||||
dump_last:
|
||||
pr_debug("args[0]: %ld args[1]: %ld\n", cb->args[0], cb->args[1]);
|
||||
for (; cb->args[1] < max; cb->args[1]++) {
|
||||
index = (ip_set_id_t) cb->args[1];
|
||||
set = ip_set_list[index];
|
||||
|
|
@ -1038,8 +1039,8 @@ ip_set_dump_start(struct sk_buff *skb, struct netlink_callback *cb)
|
|||
* so that lists (unions of sets) are dumped last.
|
||||
*/
|
||||
if (cb->args[0] != DUMP_ONE &&
|
||||
!((cb->args[0] == DUMP_ALL) ^
|
||||
(set->type->features & IPSET_DUMP_LAST)))
|
||||
((cb->args[0] == DUMP_ALL) ==
|
||||
!!(set->type->features & IPSET_DUMP_LAST)))
|
||||
continue;
|
||||
pr_debug("List set: %s\n", set->name);
|
||||
if (!cb->args[2]) {
|
||||
|
|
@ -1083,6 +1084,12 @@ ip_set_dump_start(struct sk_buff *skb, struct netlink_callback *cb)
|
|||
goto release_refcount;
|
||||
}
|
||||
}
|
||||
/* If we dump all sets, continue with dumping last ones */
|
||||
if (cb->args[0] == DUMP_ALL) {
|
||||
cb->args[0] = DUMP_LAST;
|
||||
cb->args[1] = 0;
|
||||
goto dump_last;
|
||||
}
|
||||
goto out;
|
||||
|
||||
nla_put_failure:
|
||||
|
|
@ -1093,11 +1100,6 @@ release_refcount:
|
|||
pr_debug("release set %s\n", ip_set_list[index]->name);
|
||||
ip_set_put_byindex(index);
|
||||
}
|
||||
|
||||
/* If we dump all sets, continue with dumping last ones */
|
||||
if (cb->args[0] == DUMP_ALL && cb->args[1] >= max && !cb->args[2])
|
||||
cb->args[0] = DUMP_LAST;
|
||||
|
||||
out:
|
||||
if (nlh) {
|
||||
nlmsg_end(skb, nlh);
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ set_match_v0_checkentry(const struct xt_mtchk_param *par)
|
|||
if (info->match_set.u.flags[IPSET_DIM_MAX-1] != 0) {
|
||||
pr_warning("Protocol error: set match dimension "
|
||||
"is over the limit!\n");
|
||||
ip_set_nfnl_put(info->match_set.index);
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
|
|
@ -135,6 +136,8 @@ set_target_v0_checkentry(const struct xt_tgchk_param *par)
|
|||
if (index == IPSET_INVALID_ID) {
|
||||
pr_warning("Cannot find del_set index %u as target\n",
|
||||
info->del_set.index);
|
||||
if (info->add_set.index != IPSET_INVALID_ID)
|
||||
ip_set_nfnl_put(info->add_set.index);
|
||||
return -ENOENT;
|
||||
}
|
||||
}
|
||||
|
|
@ -142,6 +145,10 @@ set_target_v0_checkentry(const struct xt_tgchk_param *par)
|
|||
info->del_set.u.flags[IPSET_DIM_MAX-1] != 0) {
|
||||
pr_warning("Protocol error: SET target dimension "
|
||||
"is over the limit!\n");
|
||||
if (info->add_set.index != IPSET_INVALID_ID)
|
||||
ip_set_nfnl_put(info->add_set.index);
|
||||
if (info->del_set.index != IPSET_INVALID_ID)
|
||||
ip_set_nfnl_put(info->del_set.index);
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
|
|
@ -192,6 +199,7 @@ set_match_checkentry(const struct xt_mtchk_param *par)
|
|||
if (info->match_set.dim > IPSET_DIM_MAX) {
|
||||
pr_warning("Protocol error: set match dimension "
|
||||
"is over the limit!\n");
|
||||
ip_set_nfnl_put(info->match_set.index);
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
|
|
@ -219,7 +227,7 @@ set_target(struct sk_buff *skb, const struct xt_action_param *par)
|
|||
if (info->del_set.index != IPSET_INVALID_ID)
|
||||
ip_set_del(info->del_set.index,
|
||||
skb, par->family,
|
||||
info->add_set.dim,
|
||||
info->del_set.dim,
|
||||
info->del_set.flags);
|
||||
|
||||
return XT_CONTINUE;
|
||||
|
|
@ -245,13 +253,19 @@ set_target_checkentry(const struct xt_tgchk_param *par)
|
|||
if (index == IPSET_INVALID_ID) {
|
||||
pr_warning("Cannot find del_set index %u as target\n",
|
||||
info->del_set.index);
|
||||
if (info->add_set.index != IPSET_INVALID_ID)
|
||||
ip_set_nfnl_put(info->add_set.index);
|
||||
return -ENOENT;
|
||||
}
|
||||
}
|
||||
if (info->add_set.dim > IPSET_DIM_MAX ||
|
||||
info->del_set.flags > IPSET_DIM_MAX) {
|
||||
info->del_set.dim > IPSET_DIM_MAX) {
|
||||
pr_warning("Protocol error: SET target dimension "
|
||||
"is over the limit!\n");
|
||||
if (info->add_set.index != IPSET_INVALID_ID)
|
||||
ip_set_nfnl_put(info->add_set.index);
|
||||
if (info->del_set.index != IPSET_INVALID_ID)
|
||||
ip_set_nfnl_put(info->del_set.index);
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -569,6 +569,8 @@ void sctp_assoc_rm_peer(struct sctp_association *asoc,
|
|||
sctp_assoc_set_primary(asoc, transport);
|
||||
if (asoc->peer.active_path == peer)
|
||||
asoc->peer.active_path = transport;
|
||||
if (asoc->peer.retran_path == peer)
|
||||
asoc->peer.retran_path = transport;
|
||||
if (asoc->peer.last_data_from == peer)
|
||||
asoc->peer.last_data_from = transport;
|
||||
|
||||
|
|
@ -1323,6 +1325,8 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
|
|||
|
||||
if (t)
|
||||
asoc->peer.retran_path = t;
|
||||
else
|
||||
t = asoc->peer.retran_path;
|
||||
|
||||
SCTP_DEBUG_PRINTK_IPADDR("sctp_assoc_update_retran_path:association"
|
||||
" %p addr: ",
|
||||
|
|
|
|||
Loading…
Reference in a new issue