mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-25 21:54:06 +08:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: [DECNET]: Endianess fixes (try #2) [TG3]: Fix array overrun in tg3_read_partno(). [NET]: Set truesize in pskb_copy [NETPOLL]: Compute checksum properly in netpoll_send_udp(). [PKT_SCHED] sch_htb: Use hlist_del_init(). [TCP]: Don't use highmem in tcp hash size calculation. [NET]: kconfig, correct traffic shaper
This commit is contained in:
commit
3ee783a3e4
@ -2833,7 +2833,7 @@ config NET_FC
|
|||||||
"SCSI generic support".
|
"SCSI generic support".
|
||||||
|
|
||||||
config SHAPER
|
config SHAPER
|
||||||
tristate "Traffic Shaper (EXPERIMENTAL)"
|
tristate "Traffic Shaper (OBSOLETE)"
|
||||||
depends on EXPERIMENTAL
|
depends on EXPERIMENTAL
|
||||||
---help---
|
---help---
|
||||||
The traffic shaper is a virtual network device that allows you to
|
The traffic shaper is a virtual network device that allows you to
|
||||||
@ -2842,9 +2842,9 @@ config SHAPER
|
|||||||
these virtual devices. See
|
these virtual devices. See
|
||||||
<file:Documentation/networking/shaper.txt> for more information.
|
<file:Documentation/networking/shaper.txt> for more information.
|
||||||
|
|
||||||
An alternative to this traffic shaper is the experimental
|
An alternative to this traffic shaper are traffic schedulers which
|
||||||
Class-Based Queuing (CBQ) scheduling support which you get if you
|
you'll get if you say Y to "QoS and/or fair queuing" in
|
||||||
say Y to "QoS and/or fair queuing" above.
|
"Networking options".
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the module
|
To compile this driver as a module, choose M here: the module
|
||||||
will be called shaper. If unsure, say N.
|
will be called shaper. If unsure, say N.
|
||||||
|
@ -10212,7 +10212,7 @@ skip_phy_reset:
|
|||||||
static void __devinit tg3_read_partno(struct tg3 *tp)
|
static void __devinit tg3_read_partno(struct tg3 *tp)
|
||||||
{
|
{
|
||||||
unsigned char vpd_data[256];
|
unsigned char vpd_data[256];
|
||||||
int i;
|
unsigned int i;
|
||||||
u32 magic;
|
u32 magic;
|
||||||
|
|
||||||
if (tg3_nvram_read_swab(tp, 0x0, &magic))
|
if (tg3_nvram_read_swab(tp, 0x0, &magic))
|
||||||
@ -10258,9 +10258,9 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Now parse and find the part number. */
|
/* Now parse and find the part number. */
|
||||||
for (i = 0; i < 256; ) {
|
for (i = 0; i < 254; ) {
|
||||||
unsigned char val = vpd_data[i];
|
unsigned char val = vpd_data[i];
|
||||||
int block_end;
|
unsigned int block_end;
|
||||||
|
|
||||||
if (val == 0x82 || val == 0x91) {
|
if (val == 0x82 || val == 0x91) {
|
||||||
i = (i + 3 +
|
i = (i + 3 +
|
||||||
@ -10276,21 +10276,26 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
|
|||||||
(vpd_data[i + 1] +
|
(vpd_data[i + 1] +
|
||||||
(vpd_data[i + 2] << 8)));
|
(vpd_data[i + 2] << 8)));
|
||||||
i += 3;
|
i += 3;
|
||||||
while (i < block_end) {
|
|
||||||
|
if (block_end > 256)
|
||||||
|
goto out_not_found;
|
||||||
|
|
||||||
|
while (i < (block_end - 2)) {
|
||||||
if (vpd_data[i + 0] == 'P' &&
|
if (vpd_data[i + 0] == 'P' &&
|
||||||
vpd_data[i + 1] == 'N') {
|
vpd_data[i + 1] == 'N') {
|
||||||
int partno_len = vpd_data[i + 2];
|
int partno_len = vpd_data[i + 2];
|
||||||
|
|
||||||
if (partno_len > 24)
|
i += 3;
|
||||||
|
if (partno_len > 24 || (partno_len + i) > 256)
|
||||||
goto out_not_found;
|
goto out_not_found;
|
||||||
|
|
||||||
memcpy(tp->board_part_number,
|
memcpy(tp->board_part_number,
|
||||||
&vpd_data[i + 3],
|
&vpd_data[i], partno_len);
|
||||||
partno_len);
|
|
||||||
|
|
||||||
/* Success. */
|
/* Success. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
i += 3 + vpd_data[i + 2];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Part number not found. */
|
/* Part number not found. */
|
||||||
|
@ -340,6 +340,12 @@ void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
|
|||||||
udph->dest = htons(np->remote_port);
|
udph->dest = htons(np->remote_port);
|
||||||
udph->len = htons(udp_len);
|
udph->len = htons(udp_len);
|
||||||
udph->check = 0;
|
udph->check = 0;
|
||||||
|
udph->check = csum_tcpudp_magic(htonl(np->local_ip),
|
||||||
|
htonl(np->remote_ip),
|
||||||
|
udp_len, IPPROTO_UDP,
|
||||||
|
csum_partial((unsigned char *)udph, udp_len, 0));
|
||||||
|
if (udph->check == 0)
|
||||||
|
udph->check = -1;
|
||||||
|
|
||||||
skb->nh.iph = iph = (struct iphdr *)skb_push(skb, sizeof(*iph));
|
skb->nh.iph = iph = (struct iphdr *)skb_push(skb, sizeof(*iph));
|
||||||
|
|
||||||
|
@ -639,6 +639,7 @@ struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask)
|
|||||||
n->csum = skb->csum;
|
n->csum = skb->csum;
|
||||||
n->ip_summed = skb->ip_summed;
|
n->ip_summed = skb->ip_summed;
|
||||||
|
|
||||||
|
n->truesize += skb->data_len;
|
||||||
n->data_len = skb->data_len;
|
n->data_len = skb->data_len;
|
||||||
n->len = skb->len;
|
n->len = skb->len;
|
||||||
|
|
||||||
|
@ -166,7 +166,7 @@ static struct hlist_head *dn_find_list(struct sock *sk)
|
|||||||
if (scp->addr.sdn_flags & SDF_WILD)
|
if (scp->addr.sdn_flags & SDF_WILD)
|
||||||
return hlist_empty(&dn_wild_sk) ? &dn_wild_sk : NULL;
|
return hlist_empty(&dn_wild_sk) ? &dn_wild_sk : NULL;
|
||||||
|
|
||||||
return &dn_sk_hash[scp->addrloc & DN_SK_HASH_MASK];
|
return &dn_sk_hash[dn_ntohs(scp->addrloc) & DN_SK_HASH_MASK];
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -180,7 +180,7 @@ static int check_port(__le16 port)
|
|||||||
if (port == 0)
|
if (port == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
sk_for_each(sk, node, &dn_sk_hash[port & DN_SK_HASH_MASK]) {
|
sk_for_each(sk, node, &dn_sk_hash[dn_ntohs(port) & DN_SK_HASH_MASK]) {
|
||||||
struct dn_scp *scp = DN_SK(sk);
|
struct dn_scp *scp = DN_SK(sk);
|
||||||
if (scp->addrloc == port)
|
if (scp->addrloc == port)
|
||||||
return -1;
|
return -1;
|
||||||
@ -194,12 +194,12 @@ static unsigned short port_alloc(struct sock *sk)
|
|||||||
static unsigned short port = 0x2000;
|
static unsigned short port = 0x2000;
|
||||||
unsigned short i_port = port;
|
unsigned short i_port = port;
|
||||||
|
|
||||||
while(check_port(++port) != 0) {
|
while(check_port(dn_htons(++port)) != 0) {
|
||||||
if (port == i_port)
|
if (port == i_port)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
scp->addrloc = port;
|
scp->addrloc = dn_htons(port);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -418,7 +418,7 @@ struct sock *dn_find_by_skb(struct sk_buff *skb)
|
|||||||
struct dn_scp *scp;
|
struct dn_scp *scp;
|
||||||
|
|
||||||
read_lock(&dn_hash_lock);
|
read_lock(&dn_hash_lock);
|
||||||
sk_for_each(sk, node, &dn_sk_hash[cb->dst_port & DN_SK_HASH_MASK]) {
|
sk_for_each(sk, node, &dn_sk_hash[dn_ntohs(cb->dst_port) & DN_SK_HASH_MASK]) {
|
||||||
scp = DN_SK(sk);
|
scp = DN_SK(sk);
|
||||||
if (cb->src != dn_saddr2dn(&scp->peer))
|
if (cb->src != dn_saddr2dn(&scp->peer))
|
||||||
continue;
|
continue;
|
||||||
@ -1016,13 +1016,14 @@ static void dn_access_copy(struct sk_buff *skb, struct accessdata_dn *acc)
|
|||||||
|
|
||||||
static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt)
|
static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt)
|
||||||
{
|
{
|
||||||
unsigned char *ptr = skb->data;
|
unsigned char *ptr = skb->data;
|
||||||
|
u16 len = *ptr++; /* yes, it's 8bit on the wire */
|
||||||
opt->opt_optl = *ptr++;
|
|
||||||
opt->opt_status = 0;
|
|
||||||
memcpy(opt->opt_data, ptr, opt->opt_optl);
|
|
||||||
skb_pull(skb, dn_ntohs(opt->opt_optl) + 1);
|
|
||||||
|
|
||||||
|
BUG_ON(len > 16); /* we've checked the contents earlier */
|
||||||
|
opt->opt_optl = dn_htons(len);
|
||||||
|
opt->opt_status = 0;
|
||||||
|
memcpy(opt->opt_data, ptr, len);
|
||||||
|
skb_pull(skb, len + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo)
|
static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo)
|
||||||
|
@ -360,9 +360,9 @@ static void dn_nsp_conn_conf(struct sock *sk, struct sk_buff *skb)
|
|||||||
scp->max_window = decnet_no_fc_max_cwnd;
|
scp->max_window = decnet_no_fc_max_cwnd;
|
||||||
|
|
||||||
if (skb->len > 0) {
|
if (skb->len > 0) {
|
||||||
unsigned char dlen = *skb->data;
|
u16 dlen = *skb->data;
|
||||||
if ((dlen <= 16) && (dlen <= skb->len)) {
|
if ((dlen <= 16) && (dlen <= skb->len)) {
|
||||||
scp->conndata_in.opt_optl = dn_htons((__u16)dlen);
|
scp->conndata_in.opt_optl = dn_htons(dlen);
|
||||||
memcpy(scp->conndata_in.opt_data, skb->data + 1, dlen);
|
memcpy(scp->conndata_in.opt_data, skb->data + 1, dlen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -404,9 +404,9 @@ static void dn_nsp_disc_init(struct sock *sk, struct sk_buff *skb)
|
|||||||
memset(scp->discdata_in.opt_data, 0, 16);
|
memset(scp->discdata_in.opt_data, 0, 16);
|
||||||
|
|
||||||
if (skb->len > 0) {
|
if (skb->len > 0) {
|
||||||
unsigned char dlen = *skb->data;
|
u16 dlen = *skb->data;
|
||||||
if ((dlen <= 16) && (dlen <= skb->len)) {
|
if ((dlen <= 16) && (dlen <= skb->len)) {
|
||||||
scp->discdata_in.opt_optl = dn_htons((__u16)dlen);
|
scp->discdata_in.opt_optl = dn_htons(dlen);
|
||||||
memcpy(scp->discdata_in.opt_data, skb->data + 1, dlen);
|
memcpy(scp->discdata_in.opt_data, skb->data + 1, dlen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -526,7 +526,7 @@ void dn_send_conn_conf(struct sock *sk, gfp_t gfp)
|
|||||||
struct nsp_conn_init_msg *msg;
|
struct nsp_conn_init_msg *msg;
|
||||||
__u8 len = (__u8)dn_ntohs(scp->conndata_out.opt_optl);
|
__u8 len = (__u8)dn_ntohs(scp->conndata_out.opt_optl);
|
||||||
|
|
||||||
if ((skb = dn_alloc_skb(sk, 50 + dn_ntohs(scp->conndata_out.opt_optl), gfp)) == NULL)
|
if ((skb = dn_alloc_skb(sk, 50 + len, gfp)) == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
msg = (struct nsp_conn_init_msg *)skb_put(skb, sizeof(*msg));
|
msg = (struct nsp_conn_init_msg *)skb_put(skb, sizeof(*msg));
|
||||||
|
@ -124,8 +124,8 @@ static struct nla_policy dn_fib_rule_policy[FRA_MAX+1] __read_mostly = {
|
|||||||
static int dn_fib_rule_match(struct fib_rule *rule, struct flowi *fl, int flags)
|
static int dn_fib_rule_match(struct fib_rule *rule, struct flowi *fl, int flags)
|
||||||
{
|
{
|
||||||
struct dn_fib_rule *r = (struct dn_fib_rule *)rule;
|
struct dn_fib_rule *r = (struct dn_fib_rule *)rule;
|
||||||
u16 daddr = fl->fld_dst;
|
__le16 daddr = fl->fld_dst;
|
||||||
u16 saddr = fl->fld_src;
|
__le16 saddr = fl->fld_src;
|
||||||
|
|
||||||
if (((saddr ^ r->src) & r->srcmask) ||
|
if (((saddr ^ r->src) & r->srcmask) ||
|
||||||
((daddr ^ r->dst) & r->dstmask))
|
((daddr ^ r->dst) & r->dstmask))
|
||||||
|
@ -2270,7 +2270,7 @@ void __init tcp_init(void)
|
|||||||
thash_entries,
|
thash_entries,
|
||||||
(num_physpages >= 128 * 1024) ?
|
(num_physpages >= 128 * 1024) ?
|
||||||
13 : 15,
|
13 : 15,
|
||||||
HASH_HIGHMEM,
|
0,
|
||||||
&tcp_hashinfo.ehash_size,
|
&tcp_hashinfo.ehash_size,
|
||||||
NULL,
|
NULL,
|
||||||
0);
|
0);
|
||||||
@ -2286,7 +2286,7 @@ void __init tcp_init(void)
|
|||||||
tcp_hashinfo.ehash_size,
|
tcp_hashinfo.ehash_size,
|
||||||
(num_physpages >= 128 * 1024) ?
|
(num_physpages >= 128 * 1024) ?
|
||||||
13 : 15,
|
13 : 15,
|
||||||
HASH_HIGHMEM,
|
0,
|
||||||
&tcp_hashinfo.bhash_size,
|
&tcp_hashinfo.bhash_size,
|
||||||
NULL,
|
NULL,
|
||||||
64 * 1024);
|
64 * 1024);
|
||||||
|
@ -1284,8 +1284,7 @@ static void htb_destroy_class(struct Qdisc *sch, struct htb_class *cl)
|
|||||||
struct htb_class, sibling));
|
struct htb_class, sibling));
|
||||||
|
|
||||||
/* note: this delete may happen twice (see htb_delete) */
|
/* note: this delete may happen twice (see htb_delete) */
|
||||||
if (!hlist_unhashed(&cl->hlist))
|
hlist_del_init(&cl->hlist);
|
||||||
hlist_del(&cl->hlist);
|
|
||||||
list_del(&cl->sibling);
|
list_del(&cl->sibling);
|
||||||
|
|
||||||
if (cl->prio_activity)
|
if (cl->prio_activity)
|
||||||
@ -1333,8 +1332,7 @@ static int htb_delete(struct Qdisc *sch, unsigned long arg)
|
|||||||
sch_tree_lock(sch);
|
sch_tree_lock(sch);
|
||||||
|
|
||||||
/* delete from hash and active; remainder in destroy_class */
|
/* delete from hash and active; remainder in destroy_class */
|
||||||
if (!hlist_unhashed(&cl->hlist))
|
hlist_del_init(&cl->hlist);
|
||||||
hlist_del(&cl->hlist);
|
|
||||||
|
|
||||||
if (cl->prio_activity)
|
if (cl->prio_activity)
|
||||||
htb_deactivate(q, cl);
|
htb_deactivate(q, cl);
|
||||||
|
Loading…
Reference in New Issue
Block a user