patch-2.1.92 linux/net/ipv6/tcp_ipv6.c
Next file: linux/net/netsyms.c
Previous file: linux/net/ipv6/ip6_output.c
Back to the patch index
Back to the overall index
- Lines: 128
- Date:
Wed Apr 1 16:19:58 1998
- Orig file:
v2.1.91/linux/net/ipv6/tcp_ipv6.c
- Orig date:
Thu Mar 26 15:57:13 1998
diff -u --recursive --new-file v2.1.91/linux/net/ipv6/tcp_ipv6.c linux/net/ipv6/tcp_ipv6.c
@@ -5,7 +5,7 @@
* Authors:
* Pedro Roque <roque@di.fc.ul.pt>
*
- * $Id: tcp_ipv6.c,v 1.68 1998/03/22 19:14:50 davem Exp $
+ * $Id: tcp_ipv6.c,v 1.72 1998/03/30 08:41:52 davem Exp $
*
* Based on:
* linux/net/ipv4/tcp.c
@@ -240,8 +240,9 @@
struct in6_addr *daddr, u16 dport,
int dif)
{
- unsigned short hnum = ntohs(dport);
struct sock *sk;
+ __u16 hnum = ntohs(dport);
+ __u32 ports = TCP_COMBINED_PORTS(sport, hnum);
int hash;
#ifdef USE_QUICKSYNS
@@ -252,13 +253,7 @@
/* Check TCP register quick cache first. */
sk = TCP_RHASH(sport);
- if(sk &&
- sk->num == hnum && /* local port */
- sk->family == AF_INET6 && /* address family */
- sk->dport == sport && /* remote port */
- !ipv6_addr_cmp(&sk->net_pinfo.af_inet6.daddr, saddr) &&
- !ipv6_addr_cmp(&sk->net_pinfo.af_inet6.rcv_saddr, daddr) &&
- (!sk->bound_dev_if || sk->bound_dev_if == dif))
+ if(sk && TCP_IPV6_MATCH(sk, saddr, daddr, ports, dif))
goto hit;
/* Optimize here for direct hit, only listening connections can
@@ -267,28 +262,23 @@
hash = tcp_v6_hashfn(daddr, hnum, saddr, sport);
for(sk = tcp_established_hash[hash]; sk; sk = sk->next) {
/* For IPV6 do the cheaper port and family tests first. */
- if(sk->num == hnum && /* local port */
- sk->family == AF_INET6 && /* address family */
- sk->dport == sport && /* remote port */
- !ipv6_addr_cmp(&sk->net_pinfo.af_inet6.daddr, saddr) &&
- !ipv6_addr_cmp(&sk->net_pinfo.af_inet6.rcv_saddr, daddr) &&
- (!sk->bound_dev_if || sk->bound_dev_if == dif)) {
+ if(TCP_IPV6_MATCH(sk, saddr, daddr, ports, dif)) {
if (sk->state == TCP_ESTABLISHED)
TCP_RHASH(sport) = sk;
goto hit; /* You sunk my battleship! */
}
}
/* Must check for a TIME_WAIT'er before going to listener hash. */
- for(sk = tcp_established_hash[hash+(TCP_HTABLE_SIZE/2)]; sk; sk = sk->next)
- if(sk->num == hnum && /* local port */
- sk->family == AF_INET6 && /* address family */
- sk->dport == sport) { /* remote port */
+ for(sk = tcp_established_hash[hash+(TCP_HTABLE_SIZE/2)]; sk; sk = sk->next) {
+ if(*((__u32 *)&(sk->dport)) == ports &&
+ sk->family == AF_INET6) {
struct tcp_tw_bucket *tw = (struct tcp_tw_bucket *)sk;
if(!ipv6_addr_cmp(&tw->v6_daddr, saddr) &&
!ipv6_addr_cmp(&tw->v6_rcv_saddr, daddr) &&
(!sk->bound_dev_if || sk->bound_dev_if == dif))
goto hit;
}
+ }
#ifdef USE_QUICKSYNS
listener_shortcut:
#endif
@@ -770,7 +760,7 @@
req->rcv_wnd = 0; /* So that tcp_send_synack() knows! */
- req->rcv_isn = skb->seq;
+ req->rcv_isn = TCP_SKB_CB(skb)->seq;
req->snt_isn = isn;
tp.tstamp_ok = tp.sack_ok = tp.wscale_ok = tp.snd_wscale = 0;
tp.in_mss = 536;
@@ -1012,7 +1002,8 @@
if (!req)
return;
/* Sequence number check required by RFC793 */
- if (before(skb->seq, req->snt_isn) || after(skb->seq, req->snt_isn+1))
+ if (before(TCP_SKB_CB(skb)->seq, req->snt_isn) ||
+ after(TCP_SKB_CB(skb)->seq, req->snt_isn+1))
return;
tcp_synq_unlink(tp, req, prev);
req->class->destructor(req);
@@ -1078,9 +1069,10 @@
goto no_tcp_socket;
}
- skb->seq = ntohl(th->seq);
- skb->end_seq = skb->seq + th->syn + th->fin + len - th->doff*4;
- skb->ack_seq = ntohl(th->ack_seq);
+ TCP_SKB_CB(skb)->seq = ntohl(th->seq);
+ TCP_SKB_CB(skb)->end_seq = (TCP_SKB_CB(skb)->seq + th->syn + th->fin +
+ len - th->doff*4);
+ TCP_SKB_CB(skb)->ack_seq = ntohl(th->ack_seq);
skb->used = 0;
if(sk->state == TCP_TIME_WAIT)
goto do_time_wait;
@@ -1300,7 +1292,7 @@
/* See draft-stevens-tcpca-spec-01 for discussion of the
* initialization of these values.
*/
- tp->snd_cwnd = 1;
+ tp->snd_cwnd = (1 << TCP_CWND_SHIFT);
tp->snd_ssthresh = 0x7fffffff;
sk->priority = 1;
@@ -1331,14 +1323,14 @@
* Cleanup up the write buffer.
*/
- while((skb = skb_dequeue(&sk->write_queue)) != NULL)
+ while((skb = __skb_dequeue(&sk->write_queue)) != NULL)
kfree_skb(skb);
/*
* Cleans up our, hopefuly empty, out_of_order_queue
*/
- while((skb = skb_dequeue(&tp->out_of_order_queue)) != NULL)
+ while((skb = __skb_dequeue(&tp->out_of_order_queue)) != NULL)
kfree_skb(skb);
/*
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov