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: (56 commits) sky2: Fix oops in sky2_xmit_frame() after TX timeout Documentation/3c509: document ethtool support af_packet: Don't use skb after dev_queue_xmit() vxge: use pci_dma_mapping_error to test return value netfilter: ebtables: enforce CAP_NET_ADMIN e1000e: fix and commonize code for setting the receive address registers e1000e: e1000e_enable_tx_pkt_filtering() returns wrong value e1000e: perform 10/100 adaptive IFS only on parts that support it e1000e: don't accumulate PHY statistics on PHY read failure e1000e: call pci_save_state() after pci_restore_state() netxen: update version to 4.0.72 netxen: fix set mac addr netxen: fix smatch warning netxen: fix tx ring memory leak tcp: update the netstamp_needed counter when cloning sockets TI DaVinci EMAC: Handle emac module clock correctly. dmfe/tulip: Let dmfe handle DM910x except for SPARC on-board chips ixgbe: Fix compiler warning about variable being used uninitialized netfilter: nf_ct_ftp: fix out of bounds read in update_nl_seq() mv643xx_eth: don't include cache padding in rx desc buffer size ... Fix trivial conflict in drivers/scsi/cxgb3i/cxgb3i_offload.c
这个提交包含在:
@@ -1406,6 +1406,9 @@ static int do_ebt_set_ctl(struct sock *sk,
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
switch(cmd) {
|
||||
case EBT_SO_SET_ENTRIES:
|
||||
ret = do_replace(sock_net(sk), user, len);
|
||||
@@ -1425,6 +1428,9 @@ static int do_ebt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
|
||||
struct ebt_replace tmp;
|
||||
struct ebt_table *t;
|
||||
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (copy_from_user(&tmp, user, sizeof(tmp)))
|
||||
return -EFAULT;
|
||||
|
||||
|
@@ -1205,6 +1205,10 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority)
|
||||
|
||||
if (newsk->sk_prot->sockets_allocated)
|
||||
percpu_counter_inc(newsk->sk_prot->sockets_allocated);
|
||||
|
||||
if (sock_flag(newsk, SOCK_TIMESTAMP) ||
|
||||
sock_flag(newsk, SOCK_TIMESTAMPING_RX_SOFTWARE))
|
||||
net_enable_timestamp();
|
||||
}
|
||||
out:
|
||||
return newsk;
|
||||
|
@@ -254,7 +254,7 @@ int ip_mc_output(struct sk_buff *skb)
|
||||
*/
|
||||
|
||||
if (rt->rt_flags&RTCF_MULTICAST) {
|
||||
if ((!sk || inet_sk(sk)->mc_loop)
|
||||
if (sk_mc_loop(sk)
|
||||
#ifdef CONFIG_IP_MROUTE
|
||||
/* Small optimization: do not loopback not local frames,
|
||||
which returned after forwarding; they will be dropped
|
||||
|
@@ -121,10 +121,9 @@ static int ip6_output2(struct sk_buff *skb)
|
||||
skb->dev = dev;
|
||||
|
||||
if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) {
|
||||
struct ipv6_pinfo* np = skb->sk ? inet6_sk(skb->sk) : NULL;
|
||||
struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
|
||||
|
||||
if (!(dev->flags & IFF_LOOPBACK) && (!np || np->mc_loop) &&
|
||||
if (!(dev->flags & IFF_LOOPBACK) && sk_mc_loop(skb->sk) &&
|
||||
((mroute6_socket(dev_net(dev)) &&
|
||||
!(IP6CB(skb)->flags & IP6SKB_FORWARDED)) ||
|
||||
ipv6_chk_mcast_addr(dev, &ipv6_hdr(skb)->daddr,
|
||||
|
@@ -112,7 +112,8 @@ config IP_VS_RR
|
||||
module, choose M here. If unsure, say N.
|
||||
|
||||
config IP_VS_WRR
|
||||
tristate "weighted round-robin scheduling"
|
||||
tristate "weighted round-robin scheduling"
|
||||
select GCD
|
||||
---help---
|
||||
The weighted robin-robin scheduling algorithm directs network
|
||||
connections to different real servers based on server weights
|
||||
|
@@ -2077,6 +2077,10 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (cmd < IP_VS_BASE_CTL || cmd > IP_VS_SO_SET_MAX)
|
||||
return -EINVAL;
|
||||
if (len < 0 || len > MAX_ARG_LEN)
|
||||
return -EINVAL;
|
||||
if (len != set_arglen[SET_CMDID(cmd)]) {
|
||||
pr_err("set_ctl: len %u != %u\n",
|
||||
len, set_arglen[SET_CMDID(cmd)]);
|
||||
@@ -2352,17 +2356,25 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
|
||||
{
|
||||
unsigned char arg[128];
|
||||
int ret = 0;
|
||||
unsigned int copylen;
|
||||
|
||||
if (!capable(CAP_NET_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
if (cmd < IP_VS_BASE_CTL || cmd > IP_VS_SO_GET_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
if (*len < get_arglen[GET_CMDID(cmd)]) {
|
||||
pr_err("get_ctl: len %u < %u\n",
|
||||
*len, get_arglen[GET_CMDID(cmd)]);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (copy_from_user(arg, user, get_arglen[GET_CMDID(cmd)]) != 0)
|
||||
copylen = get_arglen[GET_CMDID(cmd)];
|
||||
if (copylen > 128)
|
||||
return -EINVAL;
|
||||
|
||||
if (copy_from_user(arg, user, copylen) != 0)
|
||||
return -EFAULT;
|
||||
|
||||
if (mutex_lock_interruptible(&__ip_vs_mutex))
|
||||
|
@@ -24,6 +24,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/gcd.h>
|
||||
|
||||
#include <net/ip_vs.h>
|
||||
|
||||
@@ -38,20 +39,6 @@ struct ip_vs_wrr_mark {
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Get the gcd of server weights
|
||||
*/
|
||||
static int gcd(int a, int b)
|
||||
{
|
||||
int c;
|
||||
|
||||
while ((c = a % b)) {
|
||||
a = b;
|
||||
b = c;
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
static int ip_vs_wrr_gcd_weight(struct ip_vs_service *svc)
|
||||
{
|
||||
struct ip_vs_dest *dest;
|
||||
|
@@ -323,24 +323,24 @@ static void update_nl_seq(struct nf_conn *ct, u32 nl_seq,
|
||||
struct nf_ct_ftp_master *info, int dir,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
unsigned int i, oldest = NUM_SEQ_TO_REMEMBER;
|
||||
unsigned int i, oldest;
|
||||
|
||||
/* Look for oldest: if we find exact match, we're done. */
|
||||
for (i = 0; i < info->seq_aft_nl_num[dir]; i++) {
|
||||
if (info->seq_aft_nl[dir][i] == nl_seq)
|
||||
return;
|
||||
|
||||
if (oldest == info->seq_aft_nl_num[dir] ||
|
||||
before(info->seq_aft_nl[dir][i],
|
||||
info->seq_aft_nl[dir][oldest]))
|
||||
oldest = i;
|
||||
}
|
||||
|
||||
if (info->seq_aft_nl_num[dir] < NUM_SEQ_TO_REMEMBER) {
|
||||
info->seq_aft_nl[dir][info->seq_aft_nl_num[dir]++] = nl_seq;
|
||||
} else if (oldest != NUM_SEQ_TO_REMEMBER &&
|
||||
after(nl_seq, info->seq_aft_nl[dir][oldest])) {
|
||||
info->seq_aft_nl[dir][oldest] = nl_seq;
|
||||
} else {
|
||||
if (before(info->seq_aft_nl[dir][0], info->seq_aft_nl[dir][1]))
|
||||
oldest = 0;
|
||||
else
|
||||
oldest = 1;
|
||||
|
||||
if (after(nl_seq, info->seq_aft_nl[dir][oldest]))
|
||||
info->seq_aft_nl[dir][oldest] = nl_seq;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1021,8 +1021,20 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
|
||||
|
||||
status = TP_STATUS_SEND_REQUEST;
|
||||
err = dev_queue_xmit(skb);
|
||||
if (unlikely(err > 0 && (err = net_xmit_errno(err)) != 0))
|
||||
goto out_xmit;
|
||||
if (unlikely(err > 0)) {
|
||||
err = net_xmit_errno(err);
|
||||
if (err && __packet_get_status(po, ph) ==
|
||||
TP_STATUS_AVAILABLE) {
|
||||
/* skb was destructed already */
|
||||
skb = NULL;
|
||||
goto out_status;
|
||||
}
|
||||
/*
|
||||
* skb was dropped but not destructed yet;
|
||||
* let's treat it like congestion or err < 0
|
||||
*/
|
||||
err = 0;
|
||||
}
|
||||
packet_increment_head(&po->tx_ring);
|
||||
len_sum += tp_len;
|
||||
} while (likely((ph != NULL) ||
|
||||
@@ -1033,9 +1045,6 @@ static int tpacket_snd(struct packet_sock *po, struct msghdr *msg)
|
||||
err = len_sum;
|
||||
goto out_put;
|
||||
|
||||
out_xmit:
|
||||
skb->destructor = sock_wfree;
|
||||
atomic_dec(&po->tx_ring.pending);
|
||||
out_status:
|
||||
__packet_set_status(po, ph, status);
|
||||
kfree_skb(skb);
|
||||
|
@@ -75,7 +75,7 @@ static void rose_loopback_timer(unsigned long param)
|
||||
lci_i = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 0x0FF);
|
||||
frametype = skb->data[2];
|
||||
dest = (rose_address *)(skb->data + 4);
|
||||
lci_o = 0xFFF - lci_i;
|
||||
lci_o = ROSE_DEFAULT_MAXVC + 1 - lci_i;
|
||||
|
||||
skb_reset_transport_header(skb);
|
||||
|
||||
|
@@ -2087,8 +2087,7 @@ static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval,
|
||||
if (copy_from_user(&sp->autoclose, optval, optlen))
|
||||
return -EFAULT;
|
||||
/* make sure it won't exceed MAX_SCHEDULE_TIMEOUT */
|
||||
if (sp->autoclose > (MAX_SCHEDULE_TIMEOUT / HZ) )
|
||||
sp->autoclose = (__u32)(MAX_SCHEDULE_TIMEOUT / HZ) ;
|
||||
sp->autoclose = min_t(long, sp->autoclose, MAX_SCHEDULE_TIMEOUT / HZ);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
在新工单中引用
屏蔽一个用户