Commit cb3f1e7b authored by Linus Torvalds's avatar Linus Torvalds

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:
  [LAPB]: Fix windowsize check
  [TCP]: Fixes IW > 2 cases when TCP is application limited
  [PKT_SCHED] RED: Fix overflow in calculation of queue average
  [LLX]: SOCK_DGRAM interface fixes
  [PKT_SCHED]: Return ENOENT if qdisc module is unavailable
  [BRIDGE]: netlink status fix
parents 3e3183ba 558e10a5
...@@ -212,7 +212,7 @@ static inline unsigned long red_calc_qavg_from_idle_time(struct red_parms *p) ...@@ -212,7 +212,7 @@ static inline unsigned long red_calc_qavg_from_idle_time(struct red_parms *p)
* Seems, it is the best solution to * Seems, it is the best solution to
* problem of too coarse exponent tabulation. * problem of too coarse exponent tabulation.
*/ */
us_idle = (p->qavg * us_idle) >> p->Scell_log; us_idle = (p->qavg * (u64)us_idle) >> p->Scell_log;
if (us_idle < (p->qavg >> 1)) if (us_idle < (p->qavg >> 1))
return p->qavg - us_idle; return p->qavg - us_idle;
......
...@@ -85,7 +85,7 @@ void br_ifinfo_notify(int event, struct net_bridge_port *port) ...@@ -85,7 +85,7 @@ void br_ifinfo_notify(int event, struct net_bridge_port *port)
goto err_out; goto err_out;
err = br_fill_ifinfo(skb, port, current->pid, 0, event, 0); err = br_fill_ifinfo(skb, port, current->pid, 0, event, 0);
if (err) if (err < 0)
goto err_kfree; goto err_kfree;
NETLINK_CB(skb).dst_group = RTNLGRP_LINK; NETLINK_CB(skb).dst_group = RTNLGRP_LINK;
......
...@@ -3541,7 +3541,8 @@ void tcp_cwnd_application_limited(struct sock *sk) ...@@ -3541,7 +3541,8 @@ void tcp_cwnd_application_limited(struct sock *sk)
if (inet_csk(sk)->icsk_ca_state == TCP_CA_Open && if (inet_csk(sk)->icsk_ca_state == TCP_CA_Open &&
sk->sk_socket && !test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) { sk->sk_socket && !test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) {
/* Limited by application or receiver window. */ /* Limited by application or receiver window. */
u32 win_used = max(tp->snd_cwnd_used, 2U); u32 init_win = tcp_init_cwnd(tp, __sk_dst_get(sk));
u32 win_used = max(tp->snd_cwnd_used, init_win);
if (win_used < tp->snd_cwnd) { if (win_used < tp->snd_cwnd) {
tp->snd_ssthresh = tcp_current_ssthresh(sk); tp->snd_ssthresh = tcp_current_ssthresh(sk);
tp->snd_cwnd = (tp->snd_cwnd + win_used) >> 1; tp->snd_cwnd = (tp->snd_cwnd + win_used) >> 1;
......
...@@ -238,11 +238,13 @@ int lapb_setparms(struct net_device *dev, struct lapb_parms_struct *parms) ...@@ -238,11 +238,13 @@ int lapb_setparms(struct net_device *dev, struct lapb_parms_struct *parms)
goto out_put; goto out_put;
if (lapb->state == LAPB_STATE_0) { if (lapb->state == LAPB_STATE_0) {
if (((parms->mode & LAPB_EXTENDED) && if (parms->mode & LAPB_EXTENDED) {
(parms->window < 1 || parms->window > 127)) || if (parms->window < 1 || parms->window > 127)
(parms->window < 1 || parms->window > 7))
goto out_put; goto out_put;
} else {
if (parms->window < 1 || parms->window > 7)
goto out_put;
}
lapb->mode = parms->mode; lapb->mode = parms->mode;
lapb->window = parms->window; lapb->window = parms->window;
} }
......
...@@ -784,24 +784,20 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, ...@@ -784,24 +784,20 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
copied += used; copied += used;
len -= used; len -= used;
if (used + offset < skb->len)
continue;
if (!(flags & MSG_PEEK)) { if (!(flags & MSG_PEEK)) {
sk_eat_skb(sk, skb, 0); sk_eat_skb(sk, skb, 0);
*seq = 0; *seq = 0;
} }
} while (len > 0);
/* /* For non stream protcols we get one packet per recvmsg call */
* According to UNIX98, msg_name/msg_namelen are ignored if (sk->sk_type != SOCK_STREAM)
* on connected socket. -ANK
* But... af_llc still doesn't have separate sets of methods for
* SOCK_DGRAM and SOCK_STREAM :-( So we have to do this test, will
* eventually fix this tho :-) -acme
*/
if (sk->sk_type == SOCK_DGRAM)
goto copy_uaddr; goto copy_uaddr;
/* Partial read */
if (used + offset < skb->len)
continue;
} while (len > 0);
out: out:
release_sock(sk); release_sock(sk);
return copied; return copied;
......
...@@ -51,10 +51,10 @@ void llc_save_primitive(struct sock *sk, struct sk_buff* skb, u8 prim) ...@@ -51,10 +51,10 @@ void llc_save_primitive(struct sock *sk, struct sk_buff* skb, u8 prim)
{ {
struct sockaddr_llc *addr; struct sockaddr_llc *addr;
if (skb->sk->sk_type == SOCK_STREAM) /* See UNIX98 */
return;
/* save primitive for use by the user. */ /* save primitive for use by the user. */
addr = llc_ui_skb_cb(skb); addr = llc_ui_skb_cb(skb);
memset(addr, 0, sizeof(*addr));
addr->sllc_family = sk->sk_family; addr->sllc_family = sk->sk_family;
addr->sllc_arphrd = skb->dev->type; addr->sllc_arphrd = skb->dev->type;
addr->sllc_test = prim == LLC_TEST_PRIM; addr->sllc_test = prim == LLC_TEST_PRIM;
......
...@@ -430,7 +430,7 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp) ...@@ -430,7 +430,7 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp)
} }
#endif #endif
err = -EINVAL; err = -ENOENT;
if (ops == NULL) if (ops == NULL)
goto err_out; goto err_out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment