1
1
use alloc:: { boxed:: Box , sync:: Arc , vec:: Vec } ;
2
2
use smoltcp:: {
3
- socket:: { raw, tcp, udp, AnySocket } ,
3
+ socket:: { raw, tcp, udp} ,
4
4
wire,
5
5
} ;
6
6
use system_error:: SystemError ;
7
7
8
8
use crate :: {
9
- arch:: rand:: rand,
10
9
driver:: net:: NetDevice ,
11
10
kerror, kwarn,
12
11
libs:: rwlock:: RwLock ,
@@ -88,7 +87,11 @@ impl RawSocket {
88
87
impl Socket for RawSocket {
89
88
fn close ( & mut self ) {
90
89
let mut socket_set_guard = SOCKET_SET . lock_irqsave ( ) ;
91
- socket_set_guard. remove ( self . handle . smoltcp_handle ( ) . unwrap ( ) ) ; // 删除的时候,会发送一条FINISH的信息?
90
+ if let smoltcp:: socket:: Socket :: Udp ( mut sock) =
91
+ socket_set_guard. remove ( self . handle . smoltcp_handle ( ) . unwrap ( ) )
92
+ {
93
+ sock. close ( ) ;
94
+ }
92
95
drop ( socket_set_guard) ;
93
96
poll_ifaces ( ) ;
94
97
}
@@ -289,7 +292,7 @@ impl UdpSocket {
289
292
ip. port = PORT_MANAGER . get_ephemeral_port ( self . metadata . socket_type ) ?;
290
293
}
291
294
// 检测端口是否已被占用
292
- PORT_MANAGER . bind_port ( self . metadata . socket_type , ip. port , self . clone ( ) ) ?;
295
+ PORT_MANAGER . bind_port ( self . metadata . socket_type , ip. port ) ?;
293
296
294
297
let bind_res = if ip. addr . is_unspecified ( ) {
295
298
socket. bind ( ip. port )
@@ -310,7 +313,11 @@ impl UdpSocket {
310
313
impl Socket for UdpSocket {
311
314
fn close ( & mut self ) {
312
315
let mut socket_set_guard = SOCKET_SET . lock_irqsave ( ) ;
313
- socket_set_guard. remove ( self . handle . smoltcp_handle ( ) . unwrap ( ) ) ; // 删除的时候,会发送一条FINISH的信息?
316
+ if let smoltcp:: socket:: Socket :: Udp ( mut sock) =
317
+ socket_set_guard. remove ( self . handle . smoltcp_handle ( ) . unwrap ( ) )
318
+ {
319
+ sock. close ( ) ;
320
+ }
314
321
drop ( socket_set_guard) ;
315
322
poll_ifaces ( ) ;
316
323
}
@@ -559,11 +566,20 @@ impl TcpSocket {
559
566
impl Socket for TcpSocket {
560
567
fn close ( & mut self ) {
561
568
for handle in self . handles . iter ( ) {
562
- let mut socket_set_guard = SOCKET_SET . lock_irqsave ( ) ;
563
- socket_set_guard. remove ( handle. smoltcp_handle ( ) . unwrap ( ) ) ; // 删除的时候,会发送一条FINISH的信息?
564
- drop ( socket_set_guard) ;
569
+ {
570
+ let mut socket_set_guard = SOCKET_SET . lock_irqsave ( ) ;
571
+ let smoltcp_handle = handle. smoltcp_handle ( ) . unwrap ( ) ;
572
+ socket_set_guard
573
+ . get_mut :: < smoltcp:: socket:: tcp:: Socket > ( smoltcp_handle)
574
+ . close ( ) ;
575
+ drop ( socket_set_guard) ;
576
+ }
577
+ poll_ifaces ( ) ;
578
+ SOCKET_SET
579
+ . lock_irqsave ( )
580
+ . remove ( handle. smoltcp_handle ( ) . unwrap ( ) ) ;
581
+ // kdebug!("[Socket] [TCP] Close: {:?}", handle);
565
582
}
566
- poll_ifaces ( ) ;
567
583
}
568
584
569
585
fn read ( & self , buf : & mut [ u8 ] ) -> ( Result < usize , SystemError > , Endpoint ) {
@@ -627,7 +643,7 @@ impl Socket for TcpSocket {
627
643
drop ( socket_set_guard) ;
628
644
SocketHandleItem :: sleep (
629
645
self . socket_handle ( ) ,
630
- EPollEventType :: EPOLLIN . bits ( ) as u64 ,
646
+ ( EPollEventType :: EPOLLIN . bits ( ) | EPollEventType :: EPOLLHUP . bits ( ) ) as u64 ,
631
647
HANDLE_MAP . read_irqsave ( ) ,
632
648
) ;
633
649
}
@@ -697,7 +713,7 @@ impl Socket for TcpSocket {
697
713
if let Endpoint :: Ip ( Some ( ip) ) = endpoint {
698
714
let temp_port = PORT_MANAGER . get_ephemeral_port ( self . metadata . socket_type ) ?;
699
715
// 检测端口是否被占用
700
- PORT_MANAGER . bind_port ( self . metadata . socket_type , temp_port, self . clone ( ) ) ?;
716
+ PORT_MANAGER . bind_port ( self . metadata . socket_type , temp_port) ?;
701
717
702
718
// kdebug!("temp_port: {}", temp_port);
703
719
let iface: Arc < dyn NetDevice > = NET_DEVICES . write_irqsave ( ) . get ( & 0 ) . unwrap ( ) . clone ( ) ;
@@ -750,7 +766,7 @@ impl Socket for TcpSocket {
750
766
751
767
/// @brief tcp socket 监听 local_endpoint 端口
752
768
///
753
- /// @param backlog 未处理的连接队列的最大长度. 由于smoltcp不支持backlog,所以这个参数目前无效
769
+ /// @param backlog 未处理的连接队列的最大长度
754
770
fn listen ( & mut self , backlog : usize ) -> Result < ( ) , SystemError > {
755
771
if self . is_listening {
756
772
return Ok ( ( ) ) ;
@@ -763,12 +779,14 @@ impl Socket for TcpSocket {
763
779
let backlog = handlen. max ( backlog) ;
764
780
765
781
// 添加剩余需要构建的socket
766
- // kdebug!("tcp socket:before listen, socket'len={}",self.handle .len());
782
+ // kdebug!("tcp socket:before listen, socket'len={}", self.handle_list .len());
767
783
let mut handle_guard = HANDLE_MAP . write_irqsave ( ) ;
784
+ let wait_queue = Arc :: clone ( & handle_guard. get ( & self . socket_handle ( ) ) . unwrap ( ) . wait_queue ) ;
785
+
768
786
self . handles . extend ( ( handlen..backlog) . map ( |_| {
769
787
let socket = Self :: create_new_socket ( ) ;
770
788
let handle = GlobalSocketHandle :: new_smoltcp_handle ( sockets. add ( socket) ) ;
771
- let handle_item = SocketHandleItem :: new ( ) ;
789
+ let handle_item = SocketHandleItem :: new ( Some ( wait_queue . clone ( ) ) ) ;
772
790
handle_guard. insert ( handle, handle_item) ;
773
791
handle
774
792
} ) ) ;
@@ -797,7 +815,7 @@ impl Socket for TcpSocket {
797
815
}
798
816
799
817
// 检测端口是否已被占用
800
- PORT_MANAGER . bind_port ( self . metadata . socket_type , ip. port , self . clone ( ) ) ?;
818
+ PORT_MANAGER . bind_port ( self . metadata . socket_type , ip. port ) ?;
801
819
// kdebug!("tcp socket:bind, socket'len={}",self.handle.len());
802
820
803
821
self . local_endpoint = Some ( ip) ;
@@ -818,100 +836,78 @@ impl Socket for TcpSocket {
818
836
}
819
837
820
838
fn accept ( & mut self ) -> Result < ( Box < dyn Socket > , Endpoint ) , SystemError > {
839
+ if !self . is_listening {
840
+ return Err ( SystemError :: EINVAL ) ;
841
+ }
821
842
let endpoint = self . local_endpoint . ok_or ( SystemError :: EINVAL ) ?;
822
843
loop {
823
844
// kdebug!("tcp accept: poll_ifaces()");
824
845
poll_ifaces ( ) ;
825
- // kdebug!("tcp socket:accept, socket'len={}",self.handle.len());
826
-
827
- let mut sockets = SOCKET_SET . lock_irqsave ( ) ;
828
-
829
- // 随机获取访问的socket的handle
830
- let index: usize = rand ( ) % self . handles . len ( ) ;
831
- let handle = self . handles . get ( index) . unwrap ( ) ;
832
-
833
- let socket = sockets
834
- . iter_mut ( )
835
- . find ( |y| {
836
- tcp:: Socket :: downcast ( y. 1 )
837
- . map ( |y| y. is_active ( ) )
838
- . unwrap_or ( false )
839
- } )
840
- . map ( |y| tcp:: Socket :: downcast_mut ( y. 1 ) . unwrap ( ) ) ;
841
- if let Some ( socket) = socket {
842
- if socket. is_active ( ) {
843
- // kdebug!("tcp accept: socket.is_active()");
844
- let remote_ep = socket. remote_endpoint ( ) . ok_or ( SystemError :: ENOTCONN ) ?;
845
-
846
- let new_socket = {
847
- // The new TCP socket used for sending and receiving data.
848
- let mut tcp_socket = Self :: create_new_socket ( ) ;
849
- self . do_listen ( & mut tcp_socket, endpoint)
850
- . expect ( "do_listen failed" ) ;
851
-
852
- // tcp_socket.listen(endpoint).unwrap();
853
-
854
- // 之所以把old_handle存入new_socket, 是因为当前时刻,smoltcp已经把old_handle对应的socket与远程的endpoint关联起来了
855
- // 因此需要再为当前的socket分配一个新的handle
856
- let new_handle =
857
- GlobalSocketHandle :: new_smoltcp_handle ( sockets. add ( tcp_socket) ) ;
858
- let old_handle = :: core:: mem:: replace (
859
- & mut * self . handles . get_mut ( index) . unwrap ( ) ,
860
- new_handle,
861
- ) ;
862
-
863
- let metadata = SocketMetadata :: new (
864
- SocketType :: Tcp ,
865
- Self :: DEFAULT_TX_BUF_SIZE ,
866
- Self :: DEFAULT_RX_BUF_SIZE ,
867
- Self :: DEFAULT_METADATA_BUF_SIZE ,
868
- self . metadata . options ,
869
- ) ;
870
-
871
- let new_socket = Box :: new ( TcpSocket {
872
- handles : vec ! [ old_handle] ,
873
- local_endpoint : self . local_endpoint ,
874
- is_listening : false ,
875
- metadata,
876
- } ) ;
877
- // kdebug!("tcp socket:after accept, socket'len={}",new_socket.handle.len());
878
-
879
- // 更新端口与 socket 的绑定
880
- if let Some ( Endpoint :: Ip ( Some ( ip) ) ) = self . endpoint ( ) {
881
- PORT_MANAGER . unbind_port ( self . metadata . socket_type , ip. port ) ?;
882
- PORT_MANAGER . bind_port (
883
- self . metadata . socket_type ,
884
- ip. port ,
885
- * new_socket. clone ( ) ,
886
- ) ?;
887
- }
888
-
889
- // 更新handle表
890
- let mut handle_guard = HANDLE_MAP . write_irqsave ( ) ;
891
- // 先删除原来的
892
-
893
- let item = handle_guard. remove ( & old_handle) . unwrap ( ) ;
894
-
895
- // 按照smoltcp行为,将新的handle绑定到原来的item
896
- handle_guard. insert ( new_handle, item) ;
897
- let new_item = SocketHandleItem :: new ( ) ;
898
-
899
- // 插入新的item
900
- handle_guard. insert ( old_handle, new_item) ;
901
-
902
- new_socket
903
- } ;
904
- // kdebug!("tcp accept: new socket: {:?}", new_socket);
905
- drop ( sockets) ;
906
- poll_ifaces ( ) ;
907
-
908
- return Ok ( ( new_socket, Endpoint :: Ip ( Some ( remote_ep) ) ) ) ;
846
+ // kdebug!("tcp socket:accept, socket'len={}", self.handle_list.len());
847
+
848
+ let mut sockset = SOCKET_SET . lock_irqsave ( ) ;
849
+ // Get the corresponding activated handler
850
+ let global_handle_index = self . handles . iter ( ) . position ( |handle| {
851
+ let con_smol_sock = sockset. get :: < tcp:: Socket > ( handle. smoltcp_handle ( ) . unwrap ( ) ) ;
852
+ con_smol_sock. is_active ( )
853
+ } ) ;
854
+
855
+ if let Some ( handle_index) = global_handle_index {
856
+ let con_smol_sock = sockset
857
+ . get :: < tcp:: Socket > ( self . handles [ handle_index] . smoltcp_handle ( ) . unwrap ( ) ) ;
858
+
859
+ // kdebug!("[Socket] [TCP] Accept: {:?}", handle);
860
+ // handle is connected socket's handle
861
+ let remote_ep = con_smol_sock
862
+ . remote_endpoint ( )
863
+ . ok_or ( SystemError :: ENOTCONN ) ?;
864
+
865
+ let mut tcp_socket = Self :: create_new_socket ( ) ;
866
+ self . do_listen ( & mut tcp_socket, endpoint) ?;
867
+
868
+ let new_handle = GlobalSocketHandle :: new_smoltcp_handle ( sockset. add ( tcp_socket) ) ;
869
+
870
+ // let handle in TcpSock be the new empty handle, and return the old connected handle
871
+ let old_handle = core:: mem:: replace ( & mut self . handles [ handle_index] , new_handle) ;
872
+
873
+ let metadata = SocketMetadata :: new (
874
+ SocketType :: Tcp ,
875
+ Self :: DEFAULT_TX_BUF_SIZE ,
876
+ Self :: DEFAULT_RX_BUF_SIZE ,
877
+ Self :: DEFAULT_METADATA_BUF_SIZE ,
878
+ self . metadata . options ,
879
+ ) ;
880
+
881
+ let sock_ret = Box :: new ( TcpSocket {
882
+ handles : vec ! [ old_handle] ,
883
+ local_endpoint : self . local_endpoint ,
884
+ is_listening : false ,
885
+ metadata,
886
+ } ) ;
887
+
888
+ {
889
+ let mut handle_guard = HANDLE_MAP . write_irqsave ( ) ;
890
+ // 先删除原来的
891
+ let item = handle_guard. remove ( & old_handle) . unwrap ( ) ;
892
+
893
+ // 按照smoltcp行为,将新的handle绑定到原来的item
894
+ let new_item = SocketHandleItem :: new ( None ) ;
895
+ handle_guard. insert ( old_handle, new_item) ;
896
+ // 插入新的item
897
+ handle_guard. insert ( new_handle, item) ;
898
+ drop ( handle_guard) ;
909
899
}
900
+ return Ok ( ( sock_ret, Endpoint :: Ip ( Some ( remote_ep) ) ) ) ;
910
901
}
911
- // kdebug!("tcp socket:before sleep, handle_guard'len={}",HANDLE_MAP.write_irqsave().len());
912
902
913
- drop ( sockets) ;
914
- SocketHandleItem :: sleep ( * handle, Self :: CAN_ACCPET , HANDLE_MAP . read_irqsave ( ) ) ;
903
+ drop ( sockset) ;
904
+
905
+ // kdebug!("[TCP] [Accept] sleeping socket with handle: {:?}", self.handles.get(0).unwrap().smoltcp_handle().unwrap());
906
+ SocketHandleItem :: sleep (
907
+ self . socket_handle ( ) , // NOTICE
908
+ Self :: CAN_ACCPET ,
909
+ HANDLE_MAP . read_irqsave ( ) ,
910
+ ) ;
915
911
// kdebug!("tcp socket:after sleep, handle_guard'len={}",HANDLE_MAP.write_irqsave().len());
916
912
}
917
913
}
0 commit comments