3 * - Acess kernel emulation on another OS using SDL and UDP
15 int Net_Install(char **Arguments);
16 tVFS_Node *Net_Root_FindDir(tVFS_Node *Node, const char *Name, Uint Flags);
17 tVFS_Node *Net_IFace_FindDir(tVFS_Node *Node, const char *Name, Uint Flags);
18 tVFS_Node *Net_Routes_FindDir(tVFS_Node *Node, const char *Name, Uint Flags);
20 tVFS_Node *Net_TCPC_Open(int AddrType);
21 size_t Net_TCPC_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
22 size_t Net_TCPC_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags);
23 int Net_TCPC_IOCtl(tVFS_Node *Node, int IOCtl, void *Arg);
24 void Net_TCPC_Close(tVFS_Node *Node);
26 static size_t _getaddrsize(int type);
29 tVFS_NodeType gNet_NT_Root = {
30 .FindDir = Net_Root_FindDir,
32 tVFS_NodeType gNet_NT_IFace = {
33 .FindDir = Net_IFace_FindDir,
35 tVFS_NodeType gNet_NT_Routes = {
36 .FindDir = Net_Routes_FindDir,
38 tVFS_NodeType gNet_NT_TcpC = {
39 .Read = Net_TCPC_Read,
40 .Write = Net_TCPC_Write,
41 .IOCtl = Net_TCPC_IOCtl,
42 .Close = Net_TCPC_Close,
45 tDevFS_Driver gNet_DevInfo = {
48 .Type = &gNet_NT_Root,
49 .Flags = VFS_FFLAG_DIRECTORY,
52 tVFS_Node gNet_Node_IFace4 = {
53 .Type = &gNet_NT_IFace,
54 .Flags = VFS_FFLAG_DIRECTORY,
57 tVFS_Node gNet_Node_Routes = {
58 .Type = &gNet_NT_Routes,
59 .Flags = VFS_FFLAG_DIRECTORY,
63 int Net_Install(char **Arguments)
65 DevFS_AddDevice(&gNet_DevInfo);
70 tVFS_Node *Net_Root_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
72 if( strcmp(Name, "routes") == 0 )
73 return &gNet_Node_Routes;
74 else if( strcmp(Name, "any4") == 0 )
75 return &gNet_Node_IFace4;
80 tVFS_Node *Net_IFace_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
82 if( strcmp(Name, "tcpc") == 0 )
83 return Net_TCPC_Open(Node->ImplInt);
88 tVFS_Node *Net_Routes_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
90 if( Name[0] == '@' ) {
93 case '4': return &gNet_Node_IFace4;
110 tVFS_Node *Net_TCPC_Open(int AddrType)
112 tNet_TCPC *ret = calloc(sizeof(tNet_TCPC) + _getaddrsize(AddrType), 1);
114 ret->AddrType = AddrType;
115 ret->Node.ImplPtr = ret;
116 ret->Node.Type = &gNet_NT_TcpC;
117 ret->DestAddr = ret + 1;
122 size_t Net_TCPC_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
124 return Net_Wrap_ReadSocket(Node->Data, Length, Buffer);
127 size_t Net_TCPC_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags)
129 return Net_Wrap_WriteSocket(Node->Data, Length, Buffer);
132 int Net_TCPC_IOCtl(tVFS_Node *Node, int IOCtl, void *Data)
134 tNet_TCPC *tcpc = Node->ImplPtr;
139 return tcpc->SrcPort;
140 if(Node->Data) // Connection is open
143 tcpc->SrcPort = *(Uint16*)Data;
144 return tcpc->SrcPort;
146 if(!Data) return tcpc->DstPort;
147 if(Node->Data) return -1; // Connection open
149 tcpc->DstPort = *(Uint16*)Data;
150 return tcpc->DstPort;
152 if(Node->Data) return -1; // Connection open
153 memcpy(tcpc->DestAddr, Data, _getaddrsize(tcpc->AddrType));
156 Node->Data = Net_Wrap_ConnectTcp(Node, tcpc->SrcPort, tcpc->DstPort,
157 tcpc->AddrType, tcpc->DestAddr);
158 return (Node->Data != NULL);
160 Debug("TODO: TCPC rx buffer length");
167 void Net_TCPC_Close(tVFS_Node *Node)
169 tNet_TCPC *tcpc = Node->ImplPtr;
170 Node->ReferenceCount --;
171 if( Node->ReferenceCount == 0 )
173 Net_Wrap_CloseSocket(Node->Data);
179 static size_t _getaddrsize(int type)