diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-30 11:42:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-30 11:42:52 -0400 |
commit | a36f4961952214bdfc396e035a047268ac48c5c3 (patch) | |
tree | 51980e5eb355bffbc2cdd2a05b9db4fe402d6e1f | |
parent | a3ca066efb18524bf3f07137a8f8ff434022c4f2 (diff) | |
parent | a4199b0b9aa540a27935251de788cd0f5f5a87aa (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
-rw-r--r-- | MAINTAINERS | 3 | ||||
-rw-r--r-- | net/atm/lec.c | 43 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp_output.c | 9 |
4 files changed, 47 insertions, 10 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index c1bc9a86a99d..f3d9adec5aa8 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -1743,8 +1743,11 @@ S: Maintained | |||
1743 | IPVS | 1743 | IPVS |
1744 | P: Wensong Zhang | 1744 | P: Wensong Zhang |
1745 | M: wensong@linux-vs.org | 1745 | M: wensong@linux-vs.org |
1746 | P: Simon Horman | ||
1747 | M: horms@verge.net.au | ||
1746 | P: Julian Anastasov | 1748 | P: Julian Anastasov |
1747 | M: ja@ssi.bg | 1749 | M: ja@ssi.bg |
1750 | L: netdev@vger.kernel.org | ||
1748 | S: Maintained | 1751 | S: Maintained |
1749 | 1752 | ||
1750 | NFS CLIENT | 1753 | NFS CLIENT |
diff --git a/net/atm/lec.c b/net/atm/lec.c index a0752487026d..ad840b9afba8 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c | |||
@@ -686,9 +686,19 @@ static unsigned char lec_ctrl_magic[] = { | |||
686 | 0x01, | 686 | 0x01, |
687 | 0x01 }; | 687 | 0x01 }; |
688 | 688 | ||
689 | #define LEC_DATA_DIRECT_8023 2 | ||
690 | #define LEC_DATA_DIRECT_8025 3 | ||
691 | |||
692 | static int lec_is_data_direct(struct atm_vcc *vcc) | ||
693 | { | ||
694 | return ((vcc->sap.blli[0].l3.tr9577.snap[4] == LEC_DATA_DIRECT_8023) || | ||
695 | (vcc->sap.blli[0].l3.tr9577.snap[4] == LEC_DATA_DIRECT_8025)); | ||
696 | } | ||
697 | |||
689 | static void | 698 | static void |
690 | lec_push(struct atm_vcc *vcc, struct sk_buff *skb) | 699 | lec_push(struct atm_vcc *vcc, struct sk_buff *skb) |
691 | { | 700 | { |
701 | unsigned long flags; | ||
692 | struct net_device *dev = (struct net_device *)vcc->proto_data; | 702 | struct net_device *dev = (struct net_device *)vcc->proto_data; |
693 | struct lec_priv *priv = (struct lec_priv *)dev->priv; | 703 | struct lec_priv *priv = (struct lec_priv *)dev->priv; |
694 | 704 | ||
@@ -728,7 +738,8 @@ lec_push(struct atm_vcc *vcc, struct sk_buff *skb) | |||
728 | skb_queue_tail(&sk->sk_receive_queue, skb); | 738 | skb_queue_tail(&sk->sk_receive_queue, skb); |
729 | sk->sk_data_ready(sk, skb->len); | 739 | sk->sk_data_ready(sk, skb->len); |
730 | } else { /* Data frame, queue to protocol handlers */ | 740 | } else { /* Data frame, queue to protocol handlers */ |
731 | unsigned char *dst; | 741 | struct lec_arp_table *entry; |
742 | unsigned char *src, *dst; | ||
732 | 743 | ||
733 | atm_return(vcc,skb->truesize); | 744 | atm_return(vcc,skb->truesize); |
734 | if (*(uint16_t *)skb->data == htons(priv->lecid) || | 745 | if (*(uint16_t *)skb->data == htons(priv->lecid) || |
@@ -741,10 +752,30 @@ lec_push(struct atm_vcc *vcc, struct sk_buff *skb) | |||
741 | return; | 752 | return; |
742 | } | 753 | } |
743 | #ifdef CONFIG_TR | 754 | #ifdef CONFIG_TR |
744 | if (priv->is_trdev) dst = ((struct lecdatahdr_8025 *)skb->data)->h_dest; | 755 | if (priv->is_trdev) |
756 | dst = ((struct lecdatahdr_8025 *) skb->data)->h_dest; | ||
745 | else | 757 | else |
746 | #endif | 758 | #endif |
747 | dst = ((struct lecdatahdr_8023 *)skb->data)->h_dest; | 759 | dst = ((struct lecdatahdr_8023 *) skb->data)->h_dest; |
760 | |||
761 | /* If this is a Data Direct VCC, and the VCC does not match | ||
762 | * the LE_ARP cache entry, delete the LE_ARP cache entry. | ||
763 | */ | ||
764 | spin_lock_irqsave(&priv->lec_arp_lock, flags); | ||
765 | if (lec_is_data_direct(vcc)) { | ||
766 | #ifdef CONFIG_TR | ||
767 | if (priv->is_trdev) | ||
768 | src = ((struct lecdatahdr_8025 *) skb->data)->h_source; | ||
769 | else | ||
770 | #endif | ||
771 | src = ((struct lecdatahdr_8023 *) skb->data)->h_source; | ||
772 | entry = lec_arp_find(priv, src); | ||
773 | if (entry && entry->vcc != vcc) { | ||
774 | lec_arp_remove(priv, entry); | ||
775 | kfree(entry); | ||
776 | } | ||
777 | } | ||
778 | spin_unlock_irqrestore(&priv->lec_arp_lock, flags); | ||
748 | 779 | ||
749 | if (!(dst[0]&0x01) && /* Never filter Multi/Broadcast */ | 780 | if (!(dst[0]&0x01) && /* Never filter Multi/Broadcast */ |
750 | !priv->is_proxy && /* Proxy wants all the packets */ | 781 | !priv->is_proxy && /* Proxy wants all the packets */ |
@@ -1990,6 +2021,12 @@ lec_arp_resolve(struct lec_priv *priv, unsigned char *mac_to_find, | |||
1990 | found = entry->vcc; | 2021 | found = entry->vcc; |
1991 | goto out; | 2022 | goto out; |
1992 | } | 2023 | } |
2024 | /* If the LE_ARP cache entry is still pending, reset count to 0 | ||
2025 | * so another LE_ARP request can be made for this frame. | ||
2026 | */ | ||
2027 | if (entry->status == ESI_ARP_PENDING) { | ||
2028 | entry->no_tries = 0; | ||
2029 | } | ||
1993 | /* Data direct VC not yet set up, check to see if the unknown | 2030 | /* Data direct VC not yet set up, check to see if the unknown |
1994 | frame count is greater than the limit. If the limit has | 2031 | frame count is greater than the limit. If the limit has |
1995 | not been reached, allow the caller to send packet to | 2032 | not been reached, allow the caller to send packet to |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index a7537c7bbd06..677419d0c9ad 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -355,8 +355,6 @@ static void tcp_clamp_window(struct sock *sk, struct tcp_sock *tp) | |||
355 | app_win -= icsk->icsk_ack.rcv_mss; | 355 | app_win -= icsk->icsk_ack.rcv_mss; |
356 | app_win = max(app_win, 2U*tp->advmss); | 356 | app_win = max(app_win, 2U*tp->advmss); |
357 | 357 | ||
358 | if (!ofo_win) | ||
359 | tp->window_clamp = min(tp->window_clamp, app_win); | ||
360 | tp->rcv_ssthresh = min(tp->window_clamp, 2U*tp->advmss); | 358 | tp->rcv_ssthresh = min(tp->window_clamp, 2U*tp->advmss); |
361 | } | 359 | } |
362 | } | 360 | } |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index caf2e2cff293..c5b911f9b662 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -194,12 +194,11 @@ void tcp_select_initial_window(int __space, __u32 mss, | |||
194 | * will be satisfied with 2. | 194 | * will be satisfied with 2. |
195 | */ | 195 | */ |
196 | if (mss > (1<<*rcv_wscale)) { | 196 | if (mss > (1<<*rcv_wscale)) { |
197 | int init_cwnd; | 197 | int init_cwnd = 4; |
198 | 198 | if (mss > 1460*3) | |
199 | if (mss > 1460) | ||
200 | init_cwnd = 2; | 199 | init_cwnd = 2; |
201 | else | 200 | else if (mss > 1460) |
202 | init_cwnd = (mss > 1095) ? 3 : 4; | 201 | init_cwnd = 3; |
203 | if (*rcv_wnd > init_cwnd*mss) | 202 | if (*rcv_wnd > init_cwnd*mss) |
204 | *rcv_wnd = init_cwnd*mss; | 203 | *rcv_wnd = init_cwnd*mss; |
205 | } | 204 | } |