3 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #include <net/packet.h>
29 #include <net/socket.h>
32 /* Mutex for socket function */
33 MUTEX_CREATE (mutex_tcp_accept
);
35 proto_tcp_conn_t proto_tcp_conn_list
;
36 proto_tcp_backlog_t proto_tcp_backlog_list
;
38 extern netif_t netif_list
;
40 static net_port proto_tcp_client_port
;
41 static unsigned short proto_tcp_dup
;
42 static unsigned proto_tcp_seq
;
43 static unsigned proto_tcp_fd
;
46 proto_tcp_conn_t
*net_proto_tcp_conn_check (net_ipv4 ip_source
, net_port port_source
, net_ipv4 ip_dest
, net_port port_dest
, unsigned char *ret
);
47 int net_proto_tcp_conn_add ();
48 int net_proto_tcp_conn_set (proto_tcp_conn_t
*conn
, netif_t
*eth
, net_port port_source
, net_ipv4 ip_dest
, net_port port_dest
);
49 int net_proto_tcp_conn_estabilish (proto_tcp_conn_t
*conn
, netif_t
*eth
, net_ipv4 ip_dest
, net_port port_dest
);
50 int net_proto_tcp_conn_estabilish_reply (proto_tcp_conn_t
*conn
, proto_ip_t
*ip_old
, proto_tcp_t
*tcp_old
);
51 int net_proto_tcp_read_cache (proto_tcp_conn_t
*conn
, char *data
, unsigned len
);
52 int net_proto_tcp_read_ok (proto_tcp_conn_t
*conn
, proto_ip_t
*ip_old
, proto_tcp_t
*tcp_old
, unsigned len
);
53 int net_proto_tcp_write (netif_t
*eth
, net_ipv4 dest
, proto_tcp_t
*tcp
, char *data
, unsigned len
);
54 int net_proto_tcp_write_data (proto_tcp_conn_t
*conn
, char *data
, unsigned len
);
55 int net_proto_tcp_write_data_ok (proto_tcp_conn_t
*conn
, proto_ip_t
*ip_old
, proto_tcp_t
*tcp_old
);
56 int net_proto_tcp_conn_disconnected (proto_tcp_conn_t
*conn
, proto_ip_t
*ip_old
, proto_tcp_t
*tcp_old
);
57 int net_proto_tcp_conn_close (proto_tcp_conn_t
*conn
);
58 unsigned net_proto_tcp_conn_del (proto_tcp_conn_t
*conn
);
59 proto_tcp_conn_t
*net_proto_tcp_conn_find (int fd
);
60 int net_proto_tcp_backlog_add (proto_tcp_conn_t
*conn
, net_ipv4 ip
, net_port port
, unsigned seq
);
61 int net_proto_tcp_conn_invite (proto_tcp_conn_t
*conn
, net_ipv4 ip
, net_port port
, unsigned seq
);
64 * User-friendly socket functions
66 int net_proto_tcp_socket ()
68 return net_proto_tcp_conn_add ();
71 int net_proto_tcp_connect (int fd
, sockaddr_in
*addr
)
75 proto_tcp_conn_t
*conn
= net_proto_tcp_conn_find (fd
);
81 for (netif
= netif_list
.next
; netif
!= &netif_list
; netif
= netif
->next
) {
82 ret
= net_proto_tcp_conn_estabilish (conn
, netif
, addr
->sin_addr
, addr
->sin_port
);
84 /* TODO: connect timeout */
87 if (!(conn
->flags
& O_NONBLOCK
)) {
94 if (conn
->state
== PROTO_TCP_CONN_STATE_ESTABILISHED
)
97 /* when connection cant be accepted succefully first time, try it again */
98 if (conn
->state
== PROTO_TCP_CONN_STATE_ESTABILISHERROR
) {
99 ret
= net_proto_tcp_conn_estabilish (conn
, netif
, addr
->sin_addr
, addr
->sin_port
);
100 conn
->state
= PROTO_TCP_CONN_STATE_ESTABILISH
;
104 /* non-blocking mode */
113 int net_proto_tcp_send (int fd
, char *msg
, unsigned size
)
115 proto_tcp_conn_t
*conn
= net_proto_tcp_conn_find (fd
);
120 int ret
= net_proto_tcp_write_data (conn
, msg
, size
);
124 if (!(conn
->flags
& O_NONBLOCK
)) {
125 while (conn
->state
!= PROTO_TCP_CONN_STATE_READY
)
128 /* non-blocking mode */
130 while (conn
->state
!= PROTO_TCP_CONN_STATE_READY
)
138 int net_proto_tcp_recv (int fd
, char *msg
, unsigned size
)
140 proto_tcp_conn_t
*conn
= net_proto_tcp_conn_find (fd
);
148 if (!(conn
->flags
& O_NONBLOCK
)) {
149 while (!conn
->len
/* || conn->state != PROTO_TCP_CONN_STATE_READY*/) {
150 if (!conn
->state
== PROTO_TCP_CONN_STATE_CLOSE
) {
151 if (net_proto_tcp_conn_del (conn
));
158 if (conn
->state
== PROTO_TCP_CONN_STATE_CLOSE
) {
159 if (net_proto_tcp_conn_del (conn
));
167 if ((conn
->len
-conn
->offset
) > size
) {
168 memcpy (msg
, conn
->data
+conn
->offset
, size
);
169 //printf ("msg: %d %d\n", conn->offset, size);
170 conn
->offset
+= size
;
176 memcpy (msg
, conn
->data
+conn
->offset
, conn
->len
-conn
->offset
);
177 //printf ("msg2: %d %d\n", conn->offset, size);
187 int net_proto_tcp_close (int fd
)
189 proto_tcp_conn_t
*conn
= net_proto_tcp_conn_find (fd
);
194 if (conn
->state
== PROTO_TCP_CONN_STATE_DISCONNECTED
)
197 int ret
= net_proto_tcp_conn_close (conn
);
202 int net_proto_tcp_fcntl (int fd
, int cmd
, long arg
)
204 proto_tcp_conn_t
*conn
= net_proto_tcp_conn_find (fd
);
220 int net_proto_tcp_bind (int fd
, sockaddr_in
*addr
, socklen_t len
)
222 proto_tcp_conn_t
*conn
= net_proto_tcp_conn_find (fd
);
228 for (netif
= netif_list
.next
; netif
!= &netif_list
; netif
= netif
->next
) {
229 net_proto_tcp_conn_set (conn
, netif
, addr
->sin_port
, 0, 0);
237 int net_proto_tcp_listen (int fd
, int backlog
)
239 proto_tcp_conn_t
*conn
= net_proto_tcp_conn_find (fd
);
247 int net_proto_tcp_accept (int fd
, sockaddr_in
*addr
, socklen_t
*addrlen
)
249 proto_tcp_conn_t
*conn
= net_proto_tcp_conn_find (fd
);
256 proto_tcp_backlog_t
*backlog
= 0;
259 if (!(conn
->flags
& O_NONBLOCK
)) {
261 for (backlog
= proto_tcp_backlog_list
.next
; backlog
!= &proto_tcp_backlog_list
; backlog
= backlog
->next
) {
262 if (backlog
->conn
== conn
) {
271 /* non-blocking mode */
272 for (backlog
= proto_tcp_backlog_list
.next
; backlog
!= &proto_tcp_backlog_list
; backlog
= backlog
->next
) {
273 if (backlog
->conn
== conn
) {
280 //printf ("accept ()\n");
285 net_ipv4 ip
= backlog
->ip
;
286 net_port port
= backlog
->port
;
287 unsigned seq
= backlog
->seq
;
289 int ret
= net_proto_tcp_conn_invite (conn
, ip
, port
, seq
);
291 /* remove from queue accepted connection */
292 backlog
->next
->prev
= backlog
->prev
;
293 backlog
->prev
->next
= backlog
->next
;
300 int fd_new
= net_proto_tcp_conn_add ();
305 proto_tcp_conn_t
*conn_new
= net_proto_tcp_conn_find (fd_new
);
310 net_proto_tcp_conn_set (conn_new
, conn
->netif
, conn
->port_source
, conn
->netif
->ip
, port
);
312 conn_new
->ip_dest
= ip
;
318 * Hardcore code - syn, ack, psh, fin, etc :P
320 unsigned net_proto_tcp_handler (packet_t
*packet
, proto_ip_t
*ip
, char *buf
, unsigned len
)
322 proto_tcp_t
*tcp
= (proto_tcp_t
*) buf
;
324 unsigned char ret
= 0;
326 /* First check ip address and ports, that we want this data */
327 proto_tcp_conn_t
*conn
= net_proto_tcp_conn_check (ip
->ip_dest
, tcp
->port_dest
, ip
->ip_source
, tcp
->port_source
, &ret
);
331 if (!conn
&& ret
== 0)
334 //printf ("tcp->flags: 0x%x, ret: %d, conn: 0x%x\n", tcp->flags, ret, conn);
336 /* connection from client before accept () */
339 /* client want connect to our server */
340 if (tcp
->flags
== 0x02) {
341 mutex_lock (&mutex_tcp_accept
);
343 unsigned ret
= net_proto_tcp_backlog_add (conn
, ip
->ip_source
, tcp
->port_source
, tcp
->seq
);
345 mutex_unlock (&mutex_tcp_accept
);
354 if (tcp
->flags
& 0x08) {
355 /* needed for calculate real offset from 4bit number */
356 unsigned offset
= tcp
->data_offset
* 4;
358 /* now calculate accurate length of tcp _data_ */
359 unsigned size
= swap16 (ip
->total_len
) - (offset
+ (ip
->head_len
*4));
361 net_proto_tcp_read_cache (conn
, buf
+offset
, size
);
364 net_proto_tcp_read_ok (conn
, ip
, tcp
, size
);
367 /* sended data was delivered succefully */
368 if (tcp
->flags
& 0x10) {
369 if (conn
->state
== PROTO_TCP_CONN_STATE_ESTABILISH
) {
370 conn
->state
= PROTO_TCP_CONN_STATE_ESTABILISHERROR
;
371 net_proto_tcp_write_data_ok (conn
, ip
, tcp
);
373 net_proto_tcp_write_data_ok (conn
, ip
, tcp
);
376 /* connection estabilish respond */
377 if (tcp
->flags
== 0x12) {
378 return net_proto_tcp_conn_estabilish_reply (conn
, ip
, tcp
);
381 /* another side close connection */
382 if (tcp
->flags
& 0x01) {
383 DPRINT ("TCP -> fd %d connection closed by remote host\n", conn
->fd
);
384 net_proto_tcp_conn_disconnected (conn
, ip
, tcp
);
387 /* another side close connection */
388 if (tcp
->flags
& 0x04) {
389 DPRINT ("TCP -> fd %d connection reseted by peer\n", conn
->fd
);
390 net_proto_tcp_conn_disconnected (conn
, ip
, tcp
);
396 int net_proto_tcp_read_cache (proto_tcp_conn_t
*conn
, char *data
, unsigned len
)
398 if (!data
|| !conn
|| !len
)
402 conn
->data
= (char *) kmalloc (sizeof (char) * (len
+ 1));
404 conn
->data
= (char *) krealloc (conn
->data
, (sizeof (char) * (conn
->len
+len
)));
409 //kprintf ("DATA: %d - #'%s'#\n", len, data);
411 memcpy (conn
->data
+conn
->len
, data
, len
);
415 conn
->data
[conn
->len
] = '\0';
420 int net_proto_tcp_read_ok (proto_tcp_conn_t
*conn
, proto_ip_t
*ip_old
, proto_tcp_t
*tcp_old
, unsigned len
)
422 if (!ip_old
|| !tcp_old
|| !conn
)
426 proto_tcp_t
*tcp
= (proto_tcp_t
*) kmalloc (sizeof (proto_tcp_t
));
431 tcp
->port_source
= conn
->port_source
; // increase client port too
432 tcp
->port_dest
= conn
->port_dest
;
434 tcp
->seq
= tcp_old
->ack
;
436 /* this small thing did bad thing when e.g. 10 10 10 fe get to calculation,
437 it returns 10 10 10 08, no 10 10 11 08 */
438 unsigned seq
= swap32 (tcp_old
->seq
);
441 tcp
->ack
= swap32 (seq
);
444 tcp
->data_offset
= 5;
446 tcp
->window
= tcp_old
->window
+ swap16 (64);
449 int ret
= net_proto_tcp_write (conn
->netif
, conn
->ip_dest
, tcp
, 0, 0);
451 /*if (proto_tcp_dup == tcp_old->checksum) {
452 printf ("Duplicated packet :)");
457 conn
->seq
= tcp
->ack
;
458 conn
->ack
= tcp
->seq
;
460 proto_tcp_dup
= tcp_old
->checksum
;
468 int net_proto_tcp_write (netif_t
*eth
, net_ipv4 dest
, proto_tcp_t
*tcp
, char *data
, unsigned len
)
478 unsigned get
= arp_cache_get (dest
, &mac_dest
);
481 arp_send_request (eth
, dest
);
484 /* 100ms for waiting on ARP reply */
486 get
= arp_cache_get (dest
, &mac_dest
);
491 /* TODO: make better waiting for ARP reply */
504 packet_t
*packet
= (packet_t
*) kmalloc (sizeof (packet_t
));
509 memcpy (&packet
->mac_source
, eth
->dev
->dev_addr
, 6);
510 memcpy (&packet
->mac_dest
, mac_dest
, 6);
511 packet
->type
= NET_PACKET_TYPE_IPV4
;
514 proto_ip_t
*ip
= (proto_ip_t
*) kmalloc (sizeof (proto_ip_t
));
519 /* there are some fixed values - yeah it is horrible */
527 ip
->proto
= NET_PROTO_IP_TYPE_TCP
;
528 ip
->ip_source
= eth
->ip
;
531 unsigned l
= (tcp
->data_offset
*4);
533 /* calculate total length of packet (tcp/ip) */
534 ip
->total_len
= swap16 (l
+sizeof (proto_tcp_t
)+len
);
536 char *buf_tcp
= (char *) kmalloc ((len
+l
+1) * sizeof (char));
541 memcpy (buf_tcp
, (char *) tcp
, l
);
544 memcpy (buf_tcp
+l
, data
, len
);
546 buf_tcp
[l
+len
] = '\0';
548 /* calculate checksum and put it to tcp header */
549 proto_tcp_t
*tcp_
= (proto_tcp_t
*) buf_tcp
;
551 tcp_
->checksum
= checksum16_tcp (eth
->ip
, dest
, buf_tcp
, l
+len
);
553 /* send tcp header+data to ip layer */
554 unsigned ret
= net_proto_ip_send (eth
, packet
, ip
, (char *) buf_tcp
, l
+len
);
563 int net_proto_tcp_write_data (proto_tcp_conn_t
*conn
, char *data
, unsigned len
)
565 if (!conn
|| !len
|| !data
)
568 proto_tcp_t
*tcp
= (proto_tcp_t
*) kmalloc (sizeof (proto_tcp_t
));
573 tcp
->port_source
= conn
->port_source
;
574 tcp
->port_dest
= conn
->port_dest
;
576 proto_tcp_seq
+= swap32 (1);
578 tcp
->seq
= conn
->seq
;
579 tcp
->ack
= conn
->ack
;
582 tcp
->data_offset
= 5;
584 tcp
->window
= swap16 (32768);
587 int ret
= net_proto_tcp_write (conn
->netif
, conn
->ip_dest
, tcp
, data
, len
);
592 conn
->state
= PROTO_TCP_CONN_STATE_WAIT
;
597 int net_proto_tcp_write_data_ok (proto_tcp_conn_t
*conn
, proto_ip_t
*ip_old
, proto_tcp_t
*tcp_old
)
599 if (!ip_old
|| !tcp_old
|| !conn
)
602 /* cross - because we change now sides :) */
603 conn
->seq
= tcp_old
->ack
;
604 conn
->ack
= tcp_old
->seq
;
606 conn
->state
= PROTO_TCP_CONN_STATE_READY
;
611 /* try connect to server */
612 int net_proto_tcp_conn_estabilish (proto_tcp_conn_t
*conn
, netif_t
*eth
, net_ipv4 ip_dest
, net_port port_dest
)
617 proto_tcp_t
*tcp
= (proto_tcp_t
*) kmalloc (sizeof (proto_tcp_t
));
622 tcp
->port_source
= swap16 (proto_tcp_client_port
); // increase client port too
623 tcp
->port_dest
= port_dest
;
625 /* setup new connection */
626 net_proto_tcp_conn_set (conn
, eth
, tcp
->port_source
, ip_dest
, tcp
->port_dest
);
628 tcp
->seq
= conn
->seq
;
629 tcp
->ack
= conn
->ack
;
632 tcp
->data_offset
= 5;
634 tcp
->window
= swap16 (32792);
637 int ret
= net_proto_tcp_write (eth
, ip_dest
, tcp
, 0, 0);
642 net_proto_tcp_conn_del (conn
);
649 int net_proto_tcp_conn_estabilish_reply (proto_tcp_conn_t
*conn
, proto_ip_t
*ip_old
, proto_tcp_t
*tcp_old
)
651 if (!ip_old
|| !tcp_old
|| !conn
)
654 proto_tcp_t
*tcp
= (proto_tcp_t
*) kmalloc (sizeof (proto_tcp_t
));
659 tcp
->port_source
= conn
->port_source
; // increase client port too
660 tcp
->port_dest
= conn
->port_dest
;
662 tcp
->seq
= tcp_old
->ack
;
663 tcp
->ack
= tcp_old
->seq
+ swap32 (1);
666 tcp
->data_offset
= 5;
668 tcp
->window
= tcp_old
->window
+ swap16 (64);
671 int ret
= net_proto_tcp_write (conn
->netif
, conn
->ip_dest
, tcp
, 0, 0);
674 conn
->seq
= tcp
->seq
;
675 conn
->ack
= tcp
->ack
;
676 conn
->state
= PROTO_TCP_CONN_STATE_ESTABILISHED
;
679 DPRINT ("TCP -> fd %ï connected to server succefully\n", conn
->fd
);
686 int net_proto_tcp_conn_disconnected (proto_tcp_conn_t
*conn
, proto_ip_t
*ip_old
, proto_tcp_t
*tcp_old
)
688 if (!ip_old
|| !tcp_old
|| !conn
)
691 proto_tcp_t
*tcp
= (proto_tcp_t
*) kmalloc (sizeof (proto_tcp_t
));
696 tcp
->port_source
= conn
->port_source
; // increase client port too
697 tcp
->port_dest
= conn
->port_dest
;
699 tcp
->seq
= tcp_old
->ack
;
700 tcp
->ack
= tcp_old
->seq
+ swap32 (1);
703 tcp
->data_offset
= 5;
705 tcp
->window
= tcp_old
->window
+ swap16 (64);
708 int ret
= net_proto_tcp_write (conn
->netif
, conn
->ip_dest
, tcp
, 0, 0);
713 conn
->state
= PROTO_TCP_CONN_STATE_CLOSE
; //ret = net_proto_tcp_conn_del (conn);
720 int net_proto_tcp_conn_close (proto_tcp_conn_t
*conn
)
725 proto_tcp_t
*tcp
= (proto_tcp_t
*) kmalloc (sizeof (proto_tcp_t
));
730 tcp
->port_source
= conn
->port_source
; // increase client port too
731 tcp
->port_dest
= conn
->port_dest
;
733 tcp
->seq
= conn
->seq
;
734 tcp
->ack
= conn
->ack
;
737 tcp
->data_offset
= 5;
739 tcp
->window
= swap16 (32832);
742 int ret
= net_proto_tcp_write (conn
->netif
, conn
->ip_dest
, tcp
, 0, 0);
747 conn
->state
= PROTO_TCP_CONN_STATE_CLOSE
;
753 /* client wants to connect */
754 net_proto_tcp_conn_invite (proto_tcp_conn_t
*conn
, net_ipv4 ip
, net_port port
, unsigned seq
)
759 proto_tcp_t
*tcp
= (proto_tcp_t
*) kmalloc (sizeof (proto_tcp_t
));
764 tcp
->port_source
= conn
->port_source
;
765 tcp
->port_dest
= port
;
767 tcp
->seq
= proto_tcp_seq
++;
768 tcp
->ack
= seq
+ swap32 (1);
771 tcp
->data_offset
= 5;
773 tcp
->window
= swap16 (5816);
776 int ret
= net_proto_tcp_write (conn
->netif
, ip
, tcp
, 0, 0);
781 conn
->state
= PROTO_TCP_CONN_STATE_READY
;
789 /* Create new TCP connection */
790 int net_proto_tcp_conn_add ()
792 proto_tcp_conn_t
*conn
;
794 /* alloc and init context */
795 conn
= (proto_tcp_conn_t
*) kmalloc (sizeof (proto_tcp_conn_t
));
800 memset (conn
, 0, sizeof (proto_tcp_conn_t
));
805 conn
->fd
= proto_tcp_fd
++;
808 conn
->next
= &proto_tcp_conn_list
;
809 conn
->prev
= proto_tcp_conn_list
.prev
;
810 conn
->prev
->next
= conn
;
811 conn
->next
->prev
= conn
;
816 /* Setup new connection */
817 int net_proto_tcp_conn_set (proto_tcp_conn_t
*conn
, netif_t
*eth
, net_port port_source
, net_ipv4 ip_dest
, net_port port_dest
)
822 conn
->ip_source
= eth
->ip
;
823 conn
->ip_dest
= ip_dest
;
825 conn
->port_source
= port_source
;
826 conn
->port_dest
= port_dest
;
828 proto_tcp_seq
+= swap32 (1);
830 conn
->seq
= proto_tcp_seq
++;
833 conn
->state
= PROTO_TCP_CONN_STATE_ESTABILISH
;
844 /* Delete existing connection from list */
845 unsigned net_proto_tcp_conn_del (proto_tcp_conn_t
*conn
)
850 conn
->state
= PROTO_TCP_CONN_STATE_DISCONNECTED
;
857 conn
->next
->prev
= conn
->prev
;
858 conn
->prev
->next
= conn
->next
;
865 proto_tcp_conn_t
*net_proto_tcp_conn_check (net_ipv4 ip_source
, net_port port_source
, net_ipv4 ip_dest
, net_port port_dest
, unsigned char *ret
)
868 proto_tcp_conn_t
*conn
= NULL
;
869 proto_tcp_conn_t
*conn_ret
= NULL
;
870 //printf ("-------------------------\n");
871 for (conn
= proto_tcp_conn_list
.next
; conn
!= &proto_tcp_conn_list
; conn
= conn
->next
) {
873 net_proto_ip_print (conn->ip_source);
875 net_proto_ip_print (ip_source);
877 net_proto_ip_print (conn->ip_dest);
879 net_proto_ip_print (ip_dest);
880 printf ("\nporty: %d / %d\n", swap16 (conn->port_source), swap16 (port_source));
881 printf ("porty2: %d / %d\n", swap16 (conn->port_dest), swap16 (port_dest));*/
883 if (conn
->ip_source
== ip_source
&& conn
->port_source
== port_source
) {
884 if (conn
->ip_dest
== ip_dest
&& conn
->port_dest
== port_dest
) {
896 if (!conn_ret
->bind
) {
899 for (conn
= proto_tcp_conn_list
.next
; conn
!= &proto_tcp_conn_list
; conn
= conn
->next
) {
901 if (conn
->ip_source
== ip_source
&& conn
->port_source
== port_source
)
910 proto_tcp_conn_t
*net_proto_tcp_conn_find (int fd
)
912 proto_tcp_conn_t
*conn
= NULL
;
913 for (conn
= proto_tcp_conn_list
.next
; conn
!= &proto_tcp_conn_list
; conn
= conn
->next
) {
921 /* Create new TCP backlog stamp */
922 int net_proto_tcp_backlog_add (proto_tcp_conn_t
*conn
, net_ipv4 ip
, net_port port
, unsigned seq
)
927 proto_tcp_backlog_t
*backlog
;
929 /* alloc and init context */
930 backlog
= (proto_tcp_backlog_t
*) kmalloc (sizeof (proto_tcp_backlog_t
));
935 backlog
->conn
= conn
;
937 backlog
->port
= port
;
941 backlog
->next
= &proto_tcp_backlog_list
;
942 backlog
->prev
= proto_tcp_backlog_list
.prev
;
943 backlog
->prev
->next
= backlog
;
944 backlog
->next
->prev
= backlog
;
949 /* init of tcp protocol */
950 unsigned init_net_proto_tcp ()
952 proto_tcp_conn_list
.next
= &proto_tcp_conn_list
;
953 proto_tcp_conn_list
.prev
= &proto_tcp_conn_list
;
955 proto_tcp_backlog_list
.next
= &proto_tcp_backlog_list
;
956 proto_tcp_backlog_list
.prev
= &proto_tcp_backlog_list
;
958 /* base tcp client port, which is used for client's use */
959 proto_tcp_client_port
= 1024;