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);
69 tVFS_Node *Net_Root_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
71 if( strcmp(Name, "routes") == 0 )
72 return &gNet_Node_Routes;
73 else if( strcmp(Name, "any4") == 0 )
74 return &gNet_Node_IFace4;
79 tVFS_Node *Net_IFace_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
81 if( strcmp(Name, "tcpc") == 0 )
82 return Net_TCPC_Open(Node->ImplInt);
87 tVFS_Node *Net_Routes_FindDir(tVFS_Node *Node, const char *Name, Uint Flags)
89 if( Name[0] == '@' ) {
92 case '4': return &gNet_Node_IFace4;
109 tVFS_Node *Net_TCPC_Open(int AddrType)
111 tNet_TCPC *ret = calloc(sizeof(tNet_TCPC) + _getaddrsize(AddrType), 1);
113 ret->AddrType = AddrType;
114 ret->Node.ImplPtr = ret;
115 ret->Node.Type = &gNet_NT_TcpC;
116 ret->DestAddr = ret + 1;
121 size_t Net_TCPC_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags)
123 return Net_Wrap_ReadSocket(Node->Data, Length, Buffer);
126 size_t Net_TCPC_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags)
128 return Net_Wrap_WriteSocket(Node->Data, Length, Buffer);
131 int Net_TCPC_IOCtl(tVFS_Node *Node, int IOCtl, void *Data)
133 tNet_TCPC *tcpc = Node->ImplPtr;
138 return tcpc->SrcPort;
139 if(Node->Data) // Connection is open
142 tcpc->SrcPort = *(Uint16*)Data;
143 return tcpc->SrcPort;
145 if(!Data) return tcpc->DstPort;
146 if(Node->Data) return -1; // Connection open
148 tcpc->DstPort = *(Uint16*)Data;
149 return tcpc->DstPort;
151 if(Node->Data) return -1; // Connection open
152 memcpy(tcpc->DestAddr, Data, _getaddrsize(tcpc->AddrType));
155 Node->Data = Net_Wrap_ConnectTcp(Node, tcpc->SrcPort, tcpc->DstPort,
156 tcpc->AddrType, tcpc->DestAddr);
157 return (Node->Data == NULL);
159 Debug("TODO: TCPC rx buffer length");
166 void Net_TCPC_Close(tVFS_Node *Node)
168 tNet_TCPC *tcpc = Node->ImplPtr;
169 Node->ReferenceCount --;
170 if( Node->ReferenceCount == 0 )
172 Net_Wrap_CloseSocket(Node->Data);
178 static size_t _getaddrsize(int type)