PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
netdev.c
1
2#include <irx_imports.h>
3#include <netman.h>
4#include <netdev.h>
5
6static sceInetDevOps_t *g_ops;
7
8static int NetDevAdaptorStart(void)
9{
10 if (!g_ops)
11 {
12 return 0;
13 }
14 g_ops->start(g_ops->priv, 0);
15 return 0;
16}
17
18static void NetDevAdaptorStop(void)
19{
20 if (!g_ops)
21 {
22 return;
23 }
24 g_ops->stop(g_ops->priv, 0);
25}
26
27static void NetDevAdaptorXmit(void)
28{
29 if (!g_ops)
30 {
31 return;
32 }
33 g_ops->xmit(g_ops->priv, 0);
34}
35
36static int NetDevAdaptorIoctl(unsigned int command, void *args, unsigned int args_len, void *output, unsigned int length)
37{
38 int result;
39 int ret2;
40 int mode;
41
42 (void)args_len;
43 (void)length;
44
45 if (!g_ops)
46 {
47 return 0;
48 }
49
50 result = 0;
51 ret2 = 0;
52 switch (command) {
54 memcpy(output, g_ops->hw_addr, (length > sizeof(g_ops->hw_addr)) ? sizeof(g_ops->hw_addr) : length);
55 break;
56 case NETMAN_NETIF_IOCTL_ETH_GET_LINK_MODE:
57 g_ops->control(g_ops->priv, sceInetNDCC_GET_NEGO_MODE, &ret2, sizeof(ret2));
58 if (ret2 & 0x08)
59 result = NETMAN_NETIF_ETH_LINK_MODE_100M_FDX; /* 100Base-TX FDX */
60 if (ret2 & 0x04)
61 result = NETMAN_NETIF_ETH_LINK_MODE_100M_HDX; /* 100Base-TX HDX */
62 if (ret2 & 0x02)
63 result = NETMAN_NETIF_ETH_LINK_MODE_10M_FDX; /* 10Base-TX FDX */
64 if (ret2 & 0x01)
65 result = NETMAN_NETIF_ETH_LINK_MODE_10M_HDX; /* 10Base-TX HDX */
66 if (!(ret2 & 0x40))
68 break;
69 case NETMAN_NETIF_IOCTL_GET_LINK_STATUS:
70 g_ops->control(g_ops->priv, sceInetNDCC_GET_LINK_STATUS, &ret2, sizeof(ret2));
71 result = (ret2 > 0) ? NETMAN_NETIF_ETH_LINK_STATE_UP : NETMAN_NETIF_ETH_LINK_STATE_DOWN;
72 break;
73 case NETMAN_NETIF_IOCTL_GET_TX_DROPPED_COUNT:
74 g_ops->control(g_ops->priv, sceInetNDCC_GET_TX_ERRORS, &result, sizeof(result));
75 break;
76 case NETMAN_NETIF_IOCTL_GET_RX_DROPPED_COUNT:
77 g_ops->control(g_ops->priv, sceInetNDCC_GET_RX_ERRORS, &result, sizeof(result));
78 break;
79 case NETMAN_NETIF_IOCTL_ETH_GET_RX_EOVERRUN_CNT:
80 g_ops->control(g_ops->priv, sceInetNDCC_GET_RX_OVER_ER, &result, sizeof(result));
81 break;
82 case NETMAN_NETIF_IOCTL_ETH_GET_RX_EBADLEN_CNT:
83 g_ops->control(g_ops->priv, sceInetNDCC_GET_RX_LENGTH_ER, &result, sizeof(result));
84 break;
85 case NETMAN_NETIF_IOCTL_ETH_GET_RX_EBADFCS_CNT:
86 g_ops->control(g_ops->priv, sceInetNDCC_GET_RX_CRC_ER, &result, sizeof(result));
87 break;
88 case NETMAN_NETIF_IOCTL_ETH_GET_RX_EBADALIGN_CNT:
89 g_ops->control(g_ops->priv, sceInetNDCC_GET_RX_FRAME_ER, &result, sizeof(result));
90 break;
91 case NETMAN_NETIF_IOCTL_ETH_GET_TX_ELOSSCR_CNT:
92 g_ops->control(g_ops->priv, sceInetNDCC_GET_TX_CARRIER_ER, &result, sizeof(result));
93 break;
94 case NETMAN_NETIF_IOCTL_ETH_GET_TX_EEDEFER_CNT:
95 g_ops->control(g_ops->priv, sceInetNDCC_GET_TX_WINDOW_ER, &result, sizeof(result));
96 break;
97 case NETMAN_NETIF_IOCTL_ETH_GET_TX_ECOLL_CNT:
98 g_ops->control(g_ops->priv, sceInetNDCC_GET_COLLISIONS, &result, sizeof(result));
99 break;
100 case NETMAN_NETIF_IOCTL_ETH_GET_TX_EUNDERRUN_CNT:
101 g_ops->control(g_ops->priv, sceInetNDCC_GET_TX_FIFO_ER, &result, sizeof(result));
102 break;
104 int baseMode;
105
106 mode = *(int *)args;
107 baseMode = mode & (~NETMAN_NETIF_ETH_LINK_DISABLE_PAUSE);
108 ret2 = sceInetNDNEGO_AUTO | sceInetNDNEGO_TX_FD | sceInetNDNEGO_TX | sceInetNDNEGO_10_FD | sceInetNDNEGO_10;
109
110 if (baseMode != NETMAN_NETIF_ETH_LINK_MODE_AUTO) {
111 switch (baseMode) {
113 ret2 = sceInetNDNEGO_10;
114 break;
116 ret2 = sceInetNDNEGO_10_FD;
117 break;
119 ret2 = sceInetNDNEGO_TX;
120 break;
122 ret2 = sceInetNDNEGO_TX_FD;
123 break;
124 default:
125 break;
126 }
127 }
129 ret2 |= sceInetNDNEGO_PAUSE;
130 g_ops->control(g_ops->priv, sceInetNDCC_SET_NEGO_MODE, &ret2, sizeof(ret2));
131 break;
132 case NETMAN_NETIF_IOCTL_ETH_GET_STATUS:
133 g_ops->control(g_ops->priv, sceInetNDCC_GET_NEGO_MODE, &ret2, sizeof(ret2));
134 if (ret2 & 0x08)
135 result = NETMAN_NETIF_ETH_LINK_MODE_100M_FDX; /* 100Base-TX FDX */
136 if (ret2 & 0x04)
137 result = NETMAN_NETIF_ETH_LINK_MODE_100M_HDX; /* 100Base-TX HDX */
138 if (ret2 & 0x02)
139 result = NETMAN_NETIF_ETH_LINK_MODE_10M_FDX; /* 10Base-TX FDX */
140 if (ret2 & 0x01)
141 result = NETMAN_NETIF_ETH_LINK_MODE_10M_HDX; /* 10Base-TX HDX */
142 if (!(ret2 & 0x40))
144 ((struct NetManEthStatus *)output)->LinkMode = result;
145 g_ops->control(g_ops->priv, sceInetNDCC_GET_LINK_STATUS, &ret2, sizeof(ret2));
146 result = (ret2 > 0) ? NETMAN_NETIF_ETH_LINK_STATE_UP : NETMAN_NETIF_ETH_LINK_STATE_DOWN;
147 ((struct NetManEthStatus *)output)->LinkStatus = result;
148 g_ops->control(g_ops->priv, sceInetNDCC_GET_TX_ERRORS, &result, sizeof(result));
149 ((struct NetManEthStatus *)output)->stats.RxDroppedFrameCount = result;
150 // TODO: RxErrorCount not exposed through netdev ctrl
151 ((struct NetManEthStatus *)output)->stats.RxErrorCount = 0;
152 g_ops->control(g_ops->priv, sceInetNDCC_GET_RX_OVER_ER, &result, sizeof(result));
153 ((struct NetManEthStatus *)output)->stats.RxFrameOverrunCount = result;
154 g_ops->control(g_ops->priv, sceInetNDCC_GET_RX_LENGTH_ER, &result, sizeof(result));
155 ((struct NetManEthStatus *)output)->stats.RxFrameBadLengthCount = result;
156 g_ops->control(g_ops->priv, sceInetNDCC_GET_RX_CRC_ER, &result, sizeof(result));
157 ((struct NetManEthStatus *)output)->stats.RxFrameBadFCSCount = result;
158 g_ops->control(g_ops->priv, sceInetNDCC_GET_RX_FRAME_ER, &result, sizeof(result));
159 ((struct NetManEthStatus *)output)->stats.RxFrameBadAlignmentCount = result;
160 g_ops->control(g_ops->priv, sceInetNDCC_GET_TX_ERRORS, &result, sizeof(result));
161 ((struct NetManEthStatus *)output)->stats.TxDroppedFrameCount = result;
162 // TODO: TxErrorCount not exposed through netdev ctrl
163 ((struct NetManEthStatus *)output)->stats.TxErrorCount = 0;
164 g_ops->control(g_ops->priv, sceInetNDCC_GET_TX_CARRIER_ER, &result, sizeof(result));
165 ((struct NetManEthStatus *)output)->stats.TxFrameLOSSCRCount = result;
166 g_ops->control(g_ops->priv, sceInetNDCC_GET_TX_WINDOW_ER, &result, sizeof(result));
167 ((struct NetManEthStatus *)output)->stats.TxFrameEDEFERCount = result;
168 g_ops->control(g_ops->priv, sceInetNDCC_GET_COLLISIONS, &result, sizeof(result));
169 ((struct NetManEthStatus *)output)->stats.TxFrameCollisionCount = result;
170 g_ops->control(g_ops->priv, sceInetNDCC_GET_TX_FIFO_ER, &result, sizeof(result));
171 ((struct NetManEthStatus *)output)->stats.TxFrameUnderrunCount = result;
172 g_ops->control(g_ops->priv, sceInetNDCC_GET_RX_DROPPED, &result, sizeof(result));
173 ((struct NetManEthStatus *)output)->stats.RxAllocFail = result;
174 result = 0;
175 break;
176 default:
177 result = -1;
178 }
179
180 return result;
181}
182
183int sceInetRegisterNetDevice(sceInetDevOps_t *ops)
184{
185 struct NetManNetIF device;
186 if (g_ops != NULL)
187 {
188 return -1;
189 }
190 strcpy(device.name, ops->module_name);
191 device.init = &NetDevAdaptorStart;
192 device.deinit = &NetDevAdaptorStop;
193 device.xmit = &NetDevAdaptorXmit;
194 device.ioctl = &NetDevAdaptorIoctl;
195 if (NetManRegisterNetIF(&device) >= 0)
196 {
197 g_ops = ops;
198 }
199 return (g_ops != NULL) ? 0 : -1;
200}
201
202int sceInetUnregisterNetDevice(sceInetDevOps_t *ops)
203{
204 struct NetManNetIF device;
205 if (g_ops != ops)
206 {
207 return -1;
208 }
209 strcpy(device.name, ops->module_name);
210 NetManUnregisterNetIF(device.name);
211 return 0;
212}
213
214void *sceInetAllocMem(sceInetDevOps_t *ops, int siz)
215{
216 // TODO: Currently stubbed
217 return NULL;
218}
219
220void sceInetFreeMem(sceInetDevOps_t *ops, void *ptr)
221{
222 // TODO: Currently stubbed
223}
224
225void sceInetPktEnQ(sceInetPktQ_t *que, sceInetPkt_t *pkt)
226{
227 NetManNetProtStackEnQRxPacket(pkt->m_reserved1);
228}
229
230sceInetPkt_t *sceInetPktDeQ(sceInetPktQ_t *que)
231{
232 static sceInetPkt_t pkt;
233 void *data;
234 int len;
235 memset(&pkt, 0, sizeof(pkt));
236
237 data = NULL;
238 len = NetManTxPacketNext(&data);
239 pkt.rp = data;
240 pkt.wp = (void *)(((u8 *)data) + len);
241 return len ? &pkt : NULL;
242}
243
244unsigned int sceInetRand(void)
245{
246 // TODO: Currently stubbed
247 return 0;
248}
249
250int sceInetPrintf(const char *fmt, ...)
251{
252 // TODO: Currently stubbed
253 return 0;
254}
255
256sceInetPkt_t *sceInetAllocPkt(sceInetDevOps_t *ops, int siz)
257{
258 static sceInetPkt_t pkt;
259 void *payload;
260 void *pbuf;
261
262 (void)ops;
263
264 memset(&pkt, 0, sizeof(pkt));
265 pbuf = NetManNetProtStackAllocRxPacket(siz, &payload);
266 pkt.wp = payload;
267 pkt.m_reserved1 = pbuf;
268 return pbuf ? &pkt : NULL;
269}
270
271void sceInetFreePkt(sceInetDevOps_t *ops, sceInetPkt_t *pkt)
272{
273 (void)ops;
274 (void)pkt;
275
276 NetManTxPacketDeQ();
277}
@ NETMAN_NETIF_ETH_LINK_MODE_100M_HDX
Definition netman.h:63
@ NETMAN_NETIF_ETH_LINK_MODE_10M_FDX
Definition netman.h:61
@ NETMAN_NETIF_ETH_LINK_MODE_10M_HDX
Definition netman.h:59
@ NETMAN_NETIF_ETH_LINK_MODE_AUTO
Definition netman.h:57
@ NETMAN_NETIF_ETH_LINK_MODE_100M_FDX
Definition netman.h:65
@ NETMAN_NETIF_IOCTL_ETH_GET_MAC
Definition netman.h:78
@ NETMAN_NETIF_IOCTL_ETH_SET_LINK_MODE
Definition netman.h:93
#define NETMAN_NETIF_ETH_LINK_DISABLE_PAUSE
Definition netman.h:53
Definition tcpip.h:230