Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hrydgard
GitHub Repository: hrydgard/ppsspp
Path: blob/master/Core/HLE/NetInetConstants.cpp
3186 views
1
#include "ppsspp_config.h"
2
3
#include <string>
4
#include "Common/Net/SocketCompat.h"
5
#include "Common/StringUtils.h"
6
#include "Core/HLE/NetInetConstants.h"
7
#include "Core/HLE/sceKernel.h"
8
#include "Core/HLE/ErrorCodes.h"
9
#include "Core/HLE/HLE.h"
10
#ifdef __MINGW32__
11
#include <mswsock.h>
12
#endif
13
14
int convertMsgFlagPSP2Host(int flag) {
15
switch (flag) {
16
case PSP_NET_INET_MSG_OOB:
17
return MSG_OOB;
18
case PSP_NET_INET_MSG_PEEK:
19
return MSG_PEEK;
20
case PSP_NET_INET_MSG_DONTROUTE:
21
return MSG_DONTROUTE;
22
#if defined(MSG_EOR)
23
case PSP_NET_INET_MSG_EOR:
24
return MSG_EOR;
25
#endif
26
case PSP_NET_INET_MSG_TRUNC:
27
return MSG_TRUNC;
28
case PSP_NET_INET_MSG_CTRUNC:
29
return MSG_CTRUNC;
30
case PSP_NET_INET_MSG_WAITALL:
31
return MSG_WAITALL;
32
#if defined(MSG_DONTWAIT)
33
case PSP_NET_INET_MSG_DONTWAIT:
34
return MSG_DONTWAIT;
35
#endif
36
#if defined(MSG_BCAST)
37
case PSP_NET_INET_MSG_BCAST:
38
return MSG_BCAST;
39
#endif
40
#if defined(MSG_MCAST)
41
case PSP_NET_INET_MSG_MCAST:
42
return MSG_MCAST;
43
#endif
44
}
45
return hleLogError(Log::sceNet, flag, "Unknown MSG flag");
46
}
47
48
int convertMsgFlagHost2PSP(int flag) {
49
switch (flag) {
50
case MSG_OOB:
51
return PSP_NET_INET_MSG_OOB;
52
case MSG_PEEK:
53
return PSP_NET_INET_MSG_PEEK;
54
case MSG_DONTROUTE:
55
return PSP_NET_INET_MSG_DONTROUTE;
56
#if defined(MSG_EOR)
57
case MSG_EOR:
58
return PSP_NET_INET_MSG_EOR;
59
#endif
60
case MSG_TRUNC:
61
return PSP_NET_INET_MSG_TRUNC;
62
case MSG_CTRUNC:
63
return PSP_NET_INET_MSG_CTRUNC;
64
case MSG_WAITALL:
65
return PSP_NET_INET_MSG_WAITALL;
66
#if defined(MSG_DONTWAIT)
67
case MSG_DONTWAIT:
68
return PSP_NET_INET_MSG_DONTWAIT;
69
#endif
70
#if defined(MSG_BCAST)
71
case MSG_BCAST:
72
return PSP_NET_INET_MSG_BCAST;
73
#endif
74
#if defined(MSG_MCAST)
75
case MSG_MCAST:
76
return PSP_NET_INET_MSG_MCAST;
77
#endif
78
}
79
return hleLogError(Log::sceNet, flag, "Unknown MSG flag");
80
}
81
82
int convertMSGFlagsPSP2Host(int flags) {
83
// Only takes compatible one
84
int flgs = 0;
85
if (flags & PSP_NET_INET_MSG_OOB) {
86
flgs |= MSG_OOB;
87
}
88
if (flags & PSP_NET_INET_MSG_PEEK) {
89
flgs |= MSG_PEEK;
90
}
91
if (flags & PSP_NET_INET_MSG_DONTROUTE) {
92
flgs |= MSG_DONTROUTE;
93
}
94
#if defined(MSG_EOR)
95
if (flags & PSP_NET_INET_MSG_EOR) {
96
flgs |= MSG_EOR;
97
}
98
#endif
99
if (flags & PSP_NET_INET_MSG_TRUNC) {
100
flgs |= MSG_TRUNC;
101
}
102
if (flags & PSP_NET_INET_MSG_CTRUNC) {
103
flgs |= MSG_CTRUNC;
104
}
105
if (flags & PSP_NET_INET_MSG_WAITALL) {
106
flgs |= MSG_WAITALL;
107
}
108
#if defined(MSG_DONTWAIT)
109
if (flags & PSP_NET_INET_MSG_DONTWAIT) {
110
flgs |= MSG_DONTWAIT;
111
}
112
#endif
113
#if defined(MSG_BCAST)
114
if (flags & PSP_NET_INET_MSG_BCAST) {
115
flgs |= MSG_BCAST;
116
}
117
#endif
118
#if defined(MSG_MCAST)
119
if (flags & PSP_NET_INET_MSG_MCAST) {
120
flgs |= MSG_MCAST;
121
}
122
#endif
123
124
return flgs;
125
}
126
127
int convertMSGFlagsHost2PSP(int flags) {
128
// Only takes compatible one
129
int flgs = 0;
130
if (flags & MSG_OOB) {
131
flgs |= PSP_NET_INET_MSG_OOB;
132
}
133
if (flags & MSG_PEEK) {
134
flgs |= PSP_NET_INET_MSG_PEEK;
135
}
136
if (flags & MSG_DONTROUTE) {
137
flgs |= PSP_NET_INET_MSG_DONTROUTE;
138
}
139
#if defined(MSG_EOR)
140
if (flags & MSG_EOR) {
141
flgs |= PSP_NET_INET_MSG_EOR;
142
}
143
#endif
144
if (flags & MSG_TRUNC) {
145
flgs |= PSP_NET_INET_MSG_TRUNC;
146
}
147
if (flags & MSG_CTRUNC) {
148
flgs |= PSP_NET_INET_MSG_CTRUNC;
149
}
150
if (flags & MSG_WAITALL) {
151
flgs |= PSP_NET_INET_MSG_WAITALL;
152
}
153
#if defined(MSG_DONTWAIT)
154
if (flags & MSG_DONTWAIT) {
155
flgs |= PSP_NET_INET_MSG_DONTWAIT;
156
}
157
#endif
158
#if defined(MSG_BCAST)
159
if (flags & MSG_BCAST) {
160
flgs |= PSP_NET_INET_MSG_BCAST;
161
}
162
#endif
163
#if defined(MSG_MCAST)
164
if (flags & MSG_MCAST) {
165
flgs |= PSP_NET_INET_MSG_MCAST;
166
}
167
#endif
168
169
return flgs;
170
}
171
172
int convertSocketDomainPSP2Host(int domain) {
173
switch (domain) {
174
case PSP_NET_INET_AF_UNSPEC:
175
return AF_UNSPEC;
176
case PSP_NET_INET_AF_LOCAL:
177
return AF_UNIX;
178
case PSP_NET_INET_AF_INET:
179
return AF_INET;
180
}
181
return hleLogError(Log::sceNet, domain, "Unknown Socket Domain");
182
}
183
184
int convertSocketDomainHost2PSP(int domain) {
185
switch (domain) {
186
case AF_UNSPEC:
187
return PSP_NET_INET_AF_UNSPEC;
188
case AF_UNIX:
189
return PSP_NET_INET_AF_LOCAL;
190
case AF_INET:
191
return PSP_NET_INET_AF_INET;
192
}
193
return hleLogError(Log::sceNet, domain, "Unknown Socket Domain");
194
}
195
196
std::string inetSocketDomain2str(int domain) {
197
switch (domain) {
198
case PSP_NET_INET_AF_UNSPEC:
199
return "AF_UNSPEC";
200
case PSP_NET_INET_AF_UNIX:
201
return "AF_UNIX";
202
case PSP_NET_INET_AF_INET:
203
return "AF_INET";
204
}
205
return StringFromFormat("AF_%08x", domain);
206
}
207
208
int convertSocketTypePSP2Host(int type) {
209
// FIXME: Masked with 0x0F since there might be additional flags mixed in socket type that need to be converted too
210
switch (type & PSP_NET_INET_SOCK_TYPE_MASK) {
211
case PSP_NET_INET_SOCK_STREAM:
212
return SOCK_STREAM;
213
case PSP_NET_INET_SOCK_DGRAM:
214
return SOCK_DGRAM;
215
case PSP_NET_INET_SOCK_RAW:
216
// FIXME: SOCK_RAW have some restrictions on newer Windows?
217
return SOCK_RAW;
218
case PSP_NET_INET_SOCK_RDM:
219
return SOCK_RDM;
220
case PSP_NET_INET_SOCK_SEQPACKET:
221
return SOCK_SEQPACKET;
222
case PSP_NET_INET_SOCK_CONN_DGRAM: // PSP_NET_INET_SOCK_DCCP?
223
return SOCK_DGRAM; // SOCK_RAW?
224
case PSP_NET_INET_SOCK_PACKET:
225
return SOCK_STREAM; // SOCK_RAW?
226
}
227
228
return hleLogError(Log::sceNet, type, "Unknown Socket Type") & PSP_NET_INET_SOCK_TYPE_MASK;
229
}
230
231
int convertSocketTypeHost2PSP(int type) {
232
// FIXME: Masked with 0x0F since there might be additional flags mixed in socket type that need to be converted too
233
switch (type & PSP_NET_INET_SOCK_TYPE_MASK) {
234
case SOCK_STREAM:
235
return PSP_NET_INET_SOCK_STREAM;
236
case SOCK_DGRAM:
237
return PSP_NET_INET_SOCK_DGRAM;
238
case SOCK_RAW:
239
return PSP_NET_INET_SOCK_RAW;
240
case SOCK_RDM:
241
return PSP_NET_INET_SOCK_RDM;
242
case SOCK_SEQPACKET:
243
return PSP_NET_INET_SOCK_SEQPACKET;
244
#if defined(CONN_DGRAM)
245
case CONN_DGRAM: // SOCK_DCCP
246
return PSP_NET_INET_SOCK_CONN_DGRAM; // PSP_NET_INET_SOCK_DCCP
247
#endif
248
#if defined(SOCK_PACKET)
249
case SOCK_PACKET:
250
return PSP_NET_INET_SOCK_PACKET;
251
#endif
252
}
253
254
return hleLogError(Log::sceNet, type, "Unknown Socket Type") & PSP_NET_INET_SOCK_TYPE_MASK;
255
}
256
257
std::string inetSocketType2str(int type) {
258
switch (type & PSP_NET_INET_SOCK_TYPE_MASK) {
259
case PSP_NET_INET_SOCK_STREAM:
260
return "SOCK_STREAM";
261
case PSP_NET_INET_SOCK_DGRAM:
262
return "SOCK_DGRAM";
263
case PSP_NET_INET_SOCK_RAW:
264
return "SOCK_RAW";
265
case PSP_NET_INET_SOCK_RDM:
266
return "SOCK_RDM";
267
case PSP_NET_INET_SOCK_SEQPACKET:
268
return "SOCK_SEQPACKET";
269
case PSP_NET_INET_SOCK_DCCP:
270
return "SOCK_DCCP/SOCK_CONN_DGRAM?";
271
case PSP_NET_INET_SOCK_PACKET:
272
return "SOCK_PACKET?";
273
}
274
return StringFromFormat("SOCK_%08x", type);
275
}
276
277
int convertSocketProtoPSP2Host(int protocol) {
278
switch (protocol) {
279
case PSP_NET_INET_IPPROTO_UNSPEC:
280
return PSP_NET_INET_IPPROTO_UNSPEC; // 0 only valid if there is only 1 protocol available for a particular domain/family and type?
281
case PSP_NET_INET_IPPROTO_ICMP:
282
return IPPROTO_ICMP;
283
case PSP_NET_INET_IPPROTO_IGMP:
284
return IPPROTO_IGMP;
285
case PSP_NET_INET_IPPROTO_TCP:
286
return IPPROTO_TCP;
287
case PSP_NET_INET_IPPROTO_EGP:
288
return IPPROTO_EGP;
289
case PSP_NET_INET_IPPROTO_PUP:
290
return IPPROTO_PUP;
291
case PSP_NET_INET_IPPROTO_UDP:
292
return IPPROTO_UDP;
293
case PSP_NET_INET_IPPROTO_IDP:
294
return IPPROTO_IDP;
295
case PSP_NET_INET_IPPROTO_RAW:
296
return IPPROTO_RAW;
297
}
298
return hleLogError(Log::sceNet, protocol, "Unknown Socket Protocol");
299
}
300
301
int convertSocketProtoHost2PSP(int protocol) {
302
switch (protocol) {
303
case PSP_NET_INET_IPPROTO_UNSPEC:
304
return PSP_NET_INET_IPPROTO_UNSPEC; // 0 only valid if there is only 1 protocol available for a particular domain/family and type?
305
case IPPROTO_ICMP:
306
return PSP_NET_INET_IPPROTO_ICMP;
307
case IPPROTO_IGMP:
308
return PSP_NET_INET_IPPROTO_IGMP;
309
case IPPROTO_TCP:
310
return PSP_NET_INET_IPPROTO_TCP;
311
case IPPROTO_EGP:
312
return PSP_NET_INET_IPPROTO_EGP;
313
case IPPROTO_PUP:
314
return PSP_NET_INET_IPPROTO_PUP;
315
case IPPROTO_UDP:
316
return PSP_NET_INET_IPPROTO_UDP;
317
case IPPROTO_IDP:
318
return PSP_NET_INET_IPPROTO_IDP;
319
case IPPROTO_RAW:
320
return PSP_NET_INET_IPPROTO_RAW;
321
}
322
return hleLogError(Log::sceNet, protocol, "Unknown Socket Protocol");
323
}
324
325
std::string inetSocketProto2str(int protocol) {
326
switch (protocol) {
327
case PSP_NET_INET_IPPROTO_UNSPEC:
328
return "IPPROTO_UNSPEC (DEFAULT?)"; // defaulted to IPPROTO_TCP for SOCK_STREAM and IPPROTO_UDP for SOCK_DGRAM
329
case PSP_NET_INET_IPPROTO_ICMP:
330
return "IPPROTO_ICMP";
331
case PSP_NET_INET_IPPROTO_IGMP:
332
return "IPPROTO_IGMP";
333
case PSP_NET_INET_IPPROTO_TCP:
334
return "IPPROTO_TCP";
335
case PSP_NET_INET_IPPROTO_EGP:
336
return "IPPROTO_EGP";
337
case PSP_NET_INET_IPPROTO_PUP:
338
return "IPPROTO_PUP";
339
case PSP_NET_INET_IPPROTO_UDP:
340
return "IPPROTO_UDP";
341
case PSP_NET_INET_IPPROTO_IDP:
342
return "IPPROTO_IDP";
343
case PSP_NET_INET_IPPROTO_RAW:
344
return "IPPROTO_RAW";
345
}
346
return StringFromFormat("IPPROTO_%08x", protocol);
347
}
348
349
int convertCMsgTypePSP2Host(int type, int level) {
350
if (level == PSP_NET_INET_IPPROTO_IP) {
351
switch (type) {
352
#if defined(IP_RECVDSTADDR)
353
case PSP_NET_INET_IP_RECVDSTADDR:
354
return IP_RECVDSTADDR;
355
#endif
356
#if defined(IP_RECVIF)
357
case PSP_NET_INET_IP_RECVIF:
358
return IP_RECVIF;
359
#endif
360
}
361
} else if (level == PSP_NET_INET_SOL_SOCKET) {
362
#if defined(SCM_RIGHTS)
363
if (type == PSP_NET_INET_SCM_RIGHTS)
364
return SCM_RIGHTS;
365
#endif
366
#if defined(SCM_CREDS)
367
if (type == PSP_NET_INET_SCM_CREDS)
368
return SCM_CREDS;
369
#endif
370
#if defined(SCM_TIMESTAMP)
371
if (type == PSP_NET_INET_SCM_TIMESTAMP)
372
return SCM_TIMESTAMP;
373
#endif
374
}
375
return hleLogError(Log::sceNet, type, "Unknown CMSG_TYPE (Level = %08x)", level);
376
}
377
378
int convertCMsgTypeHost2PSP(int type, int level) {
379
if (level == IPPROTO_IP) {
380
switch (type) {
381
#if defined(IP_RECVDSTADDR)
382
case IP_RECVDSTADDR:
383
return PSP_NET_INET_IP_RECVDSTADDR;
384
#endif
385
#if defined(IP_RECVIF)
386
case IP_RECVIF:
387
return PSP_NET_INET_IP_RECVIF;
388
#endif
389
}
390
} else if (level == SOL_SOCKET) {
391
#if defined(SCM_RIGHTS)
392
if (type == SCM_RIGHTS)
393
return PSP_NET_INET_SCM_RIGHTS;
394
#endif
395
#if defined(SCM_CREDS)
396
if (type == SCM_CREDS)
397
return PSP_NET_INET_SCM_CREDS;
398
#endif
399
#if defined(SCM_TIMESTAMP)
400
if (type == SCM_TIMESTAMP)
401
return PSP_NET_INET_SCM_TIMESTAMP;
402
#endif
403
}
404
return hleLogError(Log::sceNet, type, "Unknown CMSG_TYPE (Level = %08x)", level);
405
}
406
407
int convertSockoptLevelPSP2Host(int level) {
408
switch (level) {
409
case PSP_NET_INET_IPPROTO_IP:
410
return IPPROTO_IP;
411
case PSP_NET_INET_IPPROTO_TCP:
412
return IPPROTO_TCP;
413
case PSP_NET_INET_IPPROTO_UDP:
414
return IPPROTO_UDP;
415
case PSP_NET_INET_SOL_SOCKET:
416
return SOL_SOCKET;
417
}
418
return hleLogError(Log::sceNet, level, "Unknown SockOpt Level");
419
}
420
421
int convertSockoptLevelHost2PSP(int level) {
422
switch (level) {
423
case IPPROTO_IP:
424
return PSP_NET_INET_IPPROTO_IP;
425
case IPPROTO_TCP:
426
return PSP_NET_INET_IPPROTO_TCP;
427
case IPPROTO_UDP:
428
return PSP_NET_INET_IPPROTO_UDP;
429
case SOL_SOCKET:
430
return PSP_NET_INET_SOL_SOCKET;
431
}
432
return hleLogError(Log::sceNet, level, "Unknown SockOpt Level");
433
}
434
435
std::string inetSockoptLevel2str(int level) {
436
switch (level) {
437
case PSP_NET_INET_IPPROTO_IP:
438
return "IPPROTO_IP";
439
case PSP_NET_INET_IPPROTO_TCP:
440
return "IPPROTO_TCP";
441
case PSP_NET_INET_IPPROTO_UDP:
442
return "IPPROTO_UDP";
443
case PSP_NET_INET_SOL_SOCKET:
444
return "SOL_SOCKET";
445
}
446
return StringFromFormat("SOL_%08x", level);
447
}
448
449
int convertSockoptNamePSP2Host(int optname, int level) {
450
if (level == PSP_NET_INET_IPPROTO_TCP) {
451
switch (optname) {
452
case PSP_NET_INET_TCP_NODELAY:
453
return TCP_NODELAY;
454
case PSP_NET_INET_TCP_MAXSEG:
455
return TCP_MAXSEG;
456
}
457
} else if (level == PSP_NET_INET_IPPROTO_IP) {
458
switch (optname) {
459
case PSP_NET_INET_IP_OPTIONS:
460
return IP_OPTIONS;
461
case PSP_NET_INET_IP_HDRINCL:
462
return IP_HDRINCL;
463
case PSP_NET_INET_IP_TOS:
464
return IP_TOS;
465
case PSP_NET_INET_IP_TTL:
466
return IP_TTL;
467
#if defined(IP_RECVOPTS)
468
case PSP_NET_INET_IP_RECVOPTS:
469
return IP_RECVOPTS;
470
#endif
471
#if defined(IP_RECVRETOPTS)
472
case PSP_NET_INET_IP_RECVRETOPTS:
473
return IP_RECVRETOPTS;
474
#endif
475
#if defined(IP_RECVDSTADDR)
476
case PSP_NET_INET_IP_RECVDSTADDR:
477
return IP_RECVDSTADDR;
478
#endif
479
#if defined(IP_RETOPTS)
480
case PSP_NET_INET_IP_RETOPTS:
481
return IP_RETOPTS;
482
#endif
483
case PSP_NET_INET_IP_MULTICAST_IF:
484
return IP_MULTICAST_IF;
485
case PSP_NET_INET_IP_MULTICAST_TTL:
486
return IP_MULTICAST_TTL;
487
case PSP_NET_INET_IP_MULTICAST_LOOP:
488
return IP_MULTICAST_LOOP;
489
case PSP_NET_INET_IP_ADD_MEMBERSHIP:
490
return IP_ADD_MEMBERSHIP;
491
case PSP_NET_INET_IP_DROP_MEMBERSHIP:
492
return IP_DROP_MEMBERSHIP;
493
#if defined(IP_PORTRANGE)
494
case PSP_NET_INET_IP_PORTRANGE:
495
return IP_PORTRANGE;
496
#endif
497
#if defined(IP_RECVIF)
498
case PSP_NET_INET_IP_RECVIF:
499
return IP_RECVIF;
500
#endif
501
#if defined(IP_ERRORMTU)
502
case PSP_NET_INET_IP_ERRORMTU:
503
return IP_ERRORMTU;
504
#endif
505
#if defined(IP_IPSEC_POLICY)
506
case PSP_NET_INET_IP_IPSEC_POLICY:
507
return IP_IPSEC_POLICY;
508
#endif
509
}
510
} else if (level == PSP_NET_INET_SOL_SOCKET) {
511
switch (optname) {
512
case PSP_NET_INET_SO_DEBUG:
513
return SO_DEBUG;
514
case PSP_NET_INET_SO_ACCEPTCONN:
515
return SO_ACCEPTCONN;
516
case PSP_NET_INET_SO_REUSEADDR:
517
return SO_REUSEADDR;
518
case PSP_NET_INET_SO_KEEPALIVE:
519
return SO_KEEPALIVE;
520
case PSP_NET_INET_SO_DONTROUTE:
521
return SO_DONTROUTE;
522
case PSP_NET_INET_SO_BROADCAST:
523
return SO_BROADCAST;
524
#if defined(SO_USELOOPBACK)
525
case PSP_NET_INET_SO_USELOOPBACK:
526
return SO_USELOOPBACK;
527
#endif
528
case PSP_NET_INET_SO_LINGER:
529
return SO_LINGER;
530
case PSP_NET_INET_SO_OOBINLINE:
531
return SO_OOBINLINE;
532
#if defined(SO_REUSEPORT)
533
case PSP_NET_INET_SO_REUSEPORT:
534
return SO_REUSEPORT;
535
#endif
536
#if defined(SO_TIMESTAMP)
537
case PSP_NET_INET_SO_TIMESTAMP:
538
return SO_TIMESTAMP;
539
#endif
540
#if defined(SO_ONESBCAST)
541
case PSP_NET_INET_SO_ONESBCAST:
542
return SO_ONESBCAST;
543
#endif
544
case PSP_NET_INET_SO_SNDBUF:
545
return SO_SNDBUF;
546
case PSP_NET_INET_SO_RCVBUF:
547
return SO_RCVBUF;
548
case PSP_NET_INET_SO_SNDLOWAT:
549
return SO_SNDLOWAT;
550
case PSP_NET_INET_SO_RCVLOWAT:
551
return SO_RCVLOWAT;
552
case PSP_NET_INET_SO_SNDTIMEO:
553
return SO_SNDTIMEO;
554
case PSP_NET_INET_SO_RCVTIMEO:
555
return SO_RCVTIMEO;
556
case PSP_NET_INET_SO_ERROR:
557
return SO_ERROR;
558
case PSP_NET_INET_SO_TYPE:
559
return SO_TYPE;
560
#if defined(SO_NBIO)
561
case PSP_NET_INET_SO_NBIO:
562
return SO_NBIO;
563
#endif
564
#if defined(SO_BIO)
565
case PSP_NET_INET_SO_BIO:
566
return SO_BIO;
567
#endif
568
}
569
}
570
return hleLogError(Log::sceNet, optname, "Unknown or unsupported PSP's SockOpt Name (Level = %08x)", level);
571
}
572
573
int convertSockoptNameHost2PSP(int optname, int level) {
574
if (level == IPPROTO_TCP) {
575
switch (optname) {
576
case TCP_NODELAY:
577
return PSP_NET_INET_TCP_NODELAY;
578
case TCP_MAXSEG:
579
return PSP_NET_INET_TCP_MAXSEG;
580
}
581
} else if (level == IPPROTO_IP) {
582
switch (optname) {
583
case IP_OPTIONS:
584
return PSP_NET_INET_IP_OPTIONS;
585
case IP_HDRINCL:
586
return PSP_NET_INET_IP_HDRINCL;
587
case IP_TOS:
588
return PSP_NET_INET_IP_TOS;
589
case IP_TTL:
590
return PSP_NET_INET_IP_TTL;
591
#if defined(IP_RECVOPTS)
592
case IP_RECVOPTS:
593
return PSP_NET_INET_IP_RECVOPTS;
594
#endif
595
#if defined(IP_RECVRETOPTS) && (IP_RECVRETOPTS != IP_RETOPTS)
596
case IP_RECVRETOPTS:
597
return PSP_NET_INET_IP_RECVRETOPTS;
598
#endif
599
#if defined(IP_RECVDSTADDR)
600
case IP_RECVDSTADDR:
601
return PSP_NET_INET_IP_RECVDSTADDR;
602
#endif
603
#if defined(IP_RETOPTS)
604
case IP_RETOPTS:
605
return PSP_NET_INET_IP_RETOPTS;
606
#endif
607
case IP_MULTICAST_IF:
608
return PSP_NET_INET_IP_MULTICAST_IF;
609
case IP_MULTICAST_TTL:
610
return PSP_NET_INET_IP_MULTICAST_TTL;
611
case IP_MULTICAST_LOOP:
612
return PSP_NET_INET_IP_MULTICAST_LOOP;
613
case IP_ADD_MEMBERSHIP:
614
return PSP_NET_INET_IP_ADD_MEMBERSHIP;
615
case IP_DROP_MEMBERSHIP:
616
return PSP_NET_INET_IP_DROP_MEMBERSHIP;
617
#if defined(IP_PORTRANGE)
618
case IP_PORTRANGE:
619
return PSP_NET_INET_IP_PORTRANGE;
620
#endif
621
#if defined(IP_RECVIF)
622
case PSP_NET_INET_IP_RECVIF:
623
return IP_RECVIF;
624
#endif
625
#if defined(IP_ERRORMTU)
626
case IP_ERRORMTU:
627
return PSP_NET_INET_IP_ERRORMTU;
628
#endif
629
#if defined(IP_IPSEC_POLICY)
630
case IP_IPSEC_POLICY:
631
return PSP_NET_INET_IP_IPSEC_POLICY;
632
#endif
633
}
634
} else if (level == SOL_SOCKET) {
635
switch (optname) {
636
case SO_DEBUG:
637
return PSP_NET_INET_SO_DEBUG;
638
case SO_ACCEPTCONN:
639
return PSP_NET_INET_SO_ACCEPTCONN;
640
case SO_REUSEADDR:
641
return PSP_NET_INET_SO_REUSEADDR;
642
case SO_KEEPALIVE:
643
return PSP_NET_INET_SO_KEEPALIVE;
644
case SO_DONTROUTE:
645
return PSP_NET_INET_SO_DONTROUTE;
646
case SO_BROADCAST:
647
return PSP_NET_INET_SO_BROADCAST;
648
#if defined(SO_USELOOPBACK)
649
case SO_USELOOPBACK:
650
return PSP_NET_INET_SO_USELOOPBACK;
651
#endif
652
case SO_LINGER:
653
return PSP_NET_INET_SO_LINGER;
654
case SO_OOBINLINE:
655
return PSP_NET_INET_SO_OOBINLINE;
656
#if defined(SO_REUSEPORT)
657
case SO_REUSEPORT:
658
return PSP_NET_INET_SO_REUSEPORT;
659
#endif
660
#if defined(SO_TIMESTAMP)
661
case SO_TIMESTAMP:
662
return PSP_NET_INET_SO_TIMESTAMP;
663
#endif
664
#if defined(SO_ONESBCAST)
665
case SO_ONESBCAST:
666
return PSP_NET_INET_SO_ONESBCAST;
667
#endif
668
case SO_SNDBUF:
669
return PSP_NET_INET_SO_SNDBUF;
670
case SO_RCVBUF:
671
return PSP_NET_INET_SO_RCVBUF;
672
case SO_SNDLOWAT:
673
return PSP_NET_INET_SO_SNDLOWAT;
674
case SO_RCVLOWAT:
675
return PSP_NET_INET_SO_RCVLOWAT;
676
case SO_SNDTIMEO:
677
return PSP_NET_INET_SO_SNDTIMEO;
678
case SO_RCVTIMEO:
679
return PSP_NET_INET_SO_RCVTIMEO;
680
case SO_ERROR:
681
return PSP_NET_INET_SO_ERROR;
682
case SO_TYPE:
683
return PSP_NET_INET_SO_TYPE;
684
#if defined(SO_NBIO)
685
case SO_NBIO:
686
return PSP_NET_INET_SO_NBIO;
687
#endif
688
#if defined(SO_BIO)
689
case SO_BIO:
690
return PSP_NET_INET_SO_BIO;
691
#endif
692
}
693
}
694
return hleLogError(Log::sceNet, optname, "Unknown Host's SockOpt Name (Level = %08x)", level);
695
}
696
697
std::string inetSockoptName2str(int optname, int level) {
698
if (level == PSP_NET_INET_IPPROTO_TCP) {
699
switch (optname) {
700
case PSP_NET_INET_TCP_NODELAY:
701
return "TCP_NODELAY";
702
case PSP_NET_INET_TCP_MAXSEG:
703
return "TCP_MAXSEG";
704
}
705
} else if (level == PSP_NET_INET_IPPROTO_IP) {
706
switch (optname) {
707
case PSP_NET_INET_IP_OPTIONS:
708
return "IP_OPTIONS";
709
case PSP_NET_INET_IP_HDRINCL:
710
return "IP_HDRINCL";
711
case PSP_NET_INET_IP_TOS:
712
return "IP_TOS";
713
case PSP_NET_INET_IP_TTL:
714
return "IP_TTL";
715
case PSP_NET_INET_IP_RECVOPTS:
716
return "IP_RECVOPTS";
717
case PSP_NET_INET_IP_RECVRETOPTS:
718
return "IP_RECVRETOPTS";
719
case PSP_NET_INET_IP_RECVDSTADDR:
720
return "IP_RECVDSTADDR";
721
case PSP_NET_INET_IP_RETOPTS:
722
return "IP_RETOPTS";
723
case PSP_NET_INET_IP_MULTICAST_IF:
724
return "IP_MULTICAST_IF";
725
case PSP_NET_INET_IP_MULTICAST_TTL:
726
return "IP_MULTICAST_TTL";
727
case PSP_NET_INET_IP_MULTICAST_LOOP:
728
return "IP_MULTICAST_LOOP";
729
case PSP_NET_INET_IP_ADD_MEMBERSHIP:
730
return "IP_ADD_MEMBERSHIP";
731
case PSP_NET_INET_IP_DROP_MEMBERSHIP:
732
return "IP_DROP_MEMBERSHIP";
733
case PSP_NET_INET_IP_PORTRANGE:
734
return "IP_PORTRANGE";
735
case PSP_NET_INET_IP_RECVIF:
736
return "IP_RECVIF";
737
case PSP_NET_INET_IP_ERRORMTU:
738
return "IP_ERRORMTU";
739
case PSP_NET_INET_IP_IPSEC_POLICY:
740
return "IP_IPSEC_POLICY";
741
}
742
} else if (level == PSP_NET_INET_SOL_SOCKET) {
743
switch (optname) {
744
case PSP_NET_INET_SO_DEBUG:
745
return "SO_DEBUG";
746
case PSP_NET_INET_SO_ACCEPTCONN:
747
return "SO_ACCEPTCONN";
748
case PSP_NET_INET_SO_REUSEADDR:
749
return "SO_REUSEADDR";
750
case PSP_NET_INET_SO_KEEPALIVE:
751
return "SO_KEEPALIVE";
752
case PSP_NET_INET_SO_DONTROUTE:
753
return "SO_DONTROUTE";
754
case PSP_NET_INET_SO_BROADCAST:
755
return "SO_BROADCAST";
756
case PSP_NET_INET_SO_USELOOPBACK:
757
return "SO_USELOOPBACK";
758
case PSP_NET_INET_SO_LINGER:
759
return "SO_LINGER";
760
case PSP_NET_INET_SO_OOBINLINE:
761
return "SO_OOBINLINE";
762
case PSP_NET_INET_SO_REUSEPORT:
763
return "SO_REUSEPORT";
764
case PSP_NET_INET_SO_TIMESTAMP:
765
return "SO_TIMESTAMP";
766
case PSP_NET_INET_SO_ONESBCAST:
767
return "SO_ONESBCAST";
768
case PSP_NET_INET_SO_SNDBUF:
769
return "SO_SNDBUF";
770
case PSP_NET_INET_SO_RCVBUF:
771
return "SO_RCVBUF";
772
case PSP_NET_INET_SO_SNDLOWAT:
773
return "SO_SNDLOWAT";
774
case PSP_NET_INET_SO_RCVLOWAT:
775
return "SO_RCVLOWAT";
776
case PSP_NET_INET_SO_SNDTIMEO:
777
return "SO_SNDTIMEO";
778
case PSP_NET_INET_SO_RCVTIMEO:
779
return "SO_RCVTIMEO";
780
case PSP_NET_INET_SO_ERROR:
781
return "SO_ERROR";
782
case PSP_NET_INET_SO_TYPE:
783
return "SO_TYPE";
784
case PSP_NET_INET_SO_NBIO:
785
return "SO_NBIO"; // SO_NONBLOCK
786
case PSP_NET_INET_SO_BIO:
787
return "SO_BIO";
788
}
789
}
790
return StringFromFormat("SO_%08x (Level = %08x)", optname, level);
791
}
792
793
int convertInetErrnoHost2PSP(int error) {
794
if (error == 0) {
795
return 0;
796
}
797
switch (error) {
798
case EINTR:
799
return ERROR_INET_EINTR;
800
case EBADF:
801
return ERROR_INET_EBADF;
802
case EACCES:
803
return ERROR_INET_EACCES;
804
case EFAULT:
805
return ERROR_INET_EFAULT;
806
case EINVAL:
807
return ERROR_INET_EINVAL;
808
case ENOSPC:
809
return ERROR_INET_ENOSPC;
810
case EPIPE:
811
return ERROR_INET_EPIPE;
812
case ENOMSG:
813
return ERROR_INET_ENOMSG;
814
case ENOLINK:
815
return ERROR_INET_ENOLINK;
816
case EPROTO:
817
return ERROR_INET_EPROTO;
818
case EBADMSG:
819
return ERROR_INET_EBADMSG;
820
case EOPNOTSUPP:
821
return ERROR_INET_EOPNOTSUPP;
822
case EPFNOSUPPORT:
823
return ERROR_INET_EPFNOSUPPORT;
824
case ECONNRESET:
825
return ERROR_INET_ECONNRESET;
826
case ENOBUFS:
827
return ERROR_INET_ENOBUFS;
828
case EAFNOSUPPORT:
829
return ERROR_INET_EAFNOSUPPORT;
830
case EPROTOTYPE:
831
return ERROR_INET_EPROTOTYPE;
832
case ENOTSOCK:
833
return ERROR_INET_ENOTSOCK;
834
case ENOPROTOOPT:
835
return ERROR_INET_ENOPROTOOPT;
836
case ESHUTDOWN:
837
return ERROR_INET_ESHUTDOWN;
838
case ECONNREFUSED:
839
return ERROR_INET_ECONNREFUSED;
840
case EADDRINUSE:
841
return ERROR_INET_EADDRINUSE;
842
case ECONNABORTED:
843
return ERROR_INET_ECONNABORTED;
844
case ENETUNREACH:
845
return ERROR_INET_ENETUNREACH;
846
case ENETDOWN:
847
return ERROR_INET_ENETDOWN;
848
case ETIMEDOUT:
849
return ERROR_INET_ETIMEDOUT;
850
case EHOSTDOWN:
851
return ERROR_INET_EHOSTDOWN;
852
case EHOSTUNREACH:
853
return ERROR_INET_EHOSTUNREACH;
854
case EALREADY:
855
return ERROR_INET_EALREADY;
856
case EMSGSIZE:
857
return ERROR_INET_EMSGSIZE;
858
case EPROTONOSUPPORT:
859
return ERROR_INET_EPROTONOSUPPORT;
860
case ESOCKTNOSUPPORT:
861
return ERROR_INET_ESOCKTNOSUPPORT;
862
case EADDRNOTAVAIL:
863
return ERROR_INET_EADDRNOTAVAIL;
864
case ENETRESET:
865
return ERROR_INET_ENETRESET;
866
case EISCONN:
867
return ERROR_INET_EISCONN;
868
case ENOTCONN:
869
return ERROR_INET_ENOTCONN;
870
case EAGAIN:
871
return ERROR_INET_EAGAIN;
872
#if !defined(_WIN32)
873
case EINPROGRESS:
874
return ERROR_INET_EINPROGRESS;
875
#endif
876
}
877
if (error != 0)
878
return hleLogError(Log::sceNet, error, "Unknown Host Error Number (%d)", error);
879
return error;
880
}
881
882
const char *convertInetErrno2str(int error) {
883
switch (error) {
884
case 0: return "(0=no error)";
885
case ERROR_INET_EINTR: return "EINTR";
886
case ERROR_INET_EBADF: return "EBADF";
887
case ERROR_INET_EACCES: return "EACCES";
888
case ERROR_INET_EFAULT: return "EFAULT";
889
case ERROR_INET_EINVAL: return "EINVAL";
890
case ERROR_INET_ENOSPC: return "ENOSPC";
891
case ERROR_INET_EPIPE: return "EPIPE";
892
case ERROR_INET_ENOMSG: return "ENOMSG";
893
case ERROR_INET_ENOLINK: return "ENOLINK";
894
case ERROR_INET_EPROTO: return "EPROTO";
895
case ERROR_INET_EBADMSG: return "EBADMSG";
896
case ERROR_INET_EOPNOTSUPP: return "EOPNOTSUPP";
897
case ERROR_INET_EPFNOSUPPORT: return "EPFNOSUPPORT";
898
case ERROR_INET_ECONNRESET: return "ECONNRESET";
899
case ERROR_INET_ENOBUFS: return "ENOBUFS";
900
case ERROR_INET_EAFNOSUPPORT: return "EAFNOSUPPORT";
901
case ERROR_INET_EPROTOTYPE: return "EPROTOTYPE";
902
case ERROR_INET_ENOTSOCK: return "ENOTSOCK";
903
case ERROR_INET_ENOPROTOOPT: return "ENOPROTOOPT";
904
case ERROR_INET_ESHUTDOWN: return "ESHUTDOWN";
905
case ERROR_INET_ECONNREFUSED: return "ECONNREFUSED";
906
case ERROR_INET_EADDRINUSE: return "EADDRINUSE";
907
case ERROR_INET_ECONNABORTED: return "ECONNABORTED";
908
case ERROR_INET_ENETUNREACH: return "ENETUNREACH";
909
case ERROR_INET_ENETDOWN: return "ENETDOWN";
910
case ERROR_INET_ETIMEDOUT: return "ETIMEDOUT";
911
case ERROR_INET_EHOSTDOWN: return "EHOSTDOWN";
912
case ERROR_INET_EHOSTUNREACH: return "EHOSTUNREACH";
913
case ERROR_INET_EALREADY: return "EALREADY";
914
case ERROR_INET_EMSGSIZE: return "EMSGSIZE";
915
case ERROR_INET_EPROTONOSUPPORT: return "EPROTONOSUPPORT";
916
case ERROR_INET_ESOCKTNOSUPPORT: return "ESOCKTNOSUPPORT";
917
case ERROR_INET_EADDRNOTAVAIL: return "EADDRNOTAVAIL";
918
case ERROR_INET_ENETRESET: return "ENETRESET";
919
case ERROR_INET_EISCONN: return "EISCONN";
920
case ERROR_INET_ENOTCONN: return "ENOTCONN";
921
case ERROR_INET_EAGAIN: return "EAGAIN";
922
default: return "(unknown!)";
923
}
924
}
925
926
// FIXME: Some of this might be wrong
927
int convertInetErrno2PSPError(int error) {
928
switch (error) {
929
case ERROR_INET_EINTR:
930
return SCE_KERNEL_ERROR_ERRNO_DEVICE_BUSY;
931
case ERROR_INET_EACCES:
932
return SCE_KERNEL_ERROR_ERRNO_READ_ONLY;
933
case ERROR_INET_EFAULT:
934
return SCE_KERNEL_ERROR_ERRNO_ADDR_OUT_OF_MAIN_MEM;
935
case ERROR_INET_EINVAL:
936
return SCE_KERNEL_ERROR_ERRNO_INVALID_ARGUMENT;
937
case ERROR_INET_ENOSPC:
938
return SCE_KERNEL_ERROR_ERRNO_NO_MEMORY;
939
case ERROR_INET_EPIPE:
940
return SCE_KERNEL_ERROR_ERRNO_FILE_NOT_FOUND;
941
case ERROR_INET_ENOMSG:
942
return SCE_KERNEL_ERROR_ERRNO_NO_MEDIA;
943
case ERROR_INET_ENOLINK:
944
return SCE_KERNEL_ERROR_ERRNO_DEVICE_NOT_FOUND;
945
case ERROR_INET_EPROTO:
946
return SCE_KERNEL_ERROR_ERRNO_FILE_PROTOCOL;
947
case ERROR_INET_EBADMSG:
948
return SCE_KERNEL_ERROR_ERRNO_INVALID_MEDIUM;
949
case ERROR_INET_EOPNOTSUPP:
950
return SCE_KERNEL_ERROR_ERRNO_FUNCTION_NOT_SUPPORTED;
951
case ERROR_INET_EPFNOSUPPORT:
952
return SCE_KERNEL_ERROR_ERRNO_FUNCTION_NOT_SUPPORTED;
953
case ERROR_INET_ECONNRESET:
954
return SCE_KERNEL_ERROR_ERRNO_CONNECTION_RESET;
955
case ERROR_INET_ENOBUFS:
956
return SCE_KERNEL_ERROR_ERRNO_NO_FREE_BUF_SPACE;
957
case ERROR_INET_EAFNOSUPPORT:
958
return SCE_KERNEL_ERROR_ERRNO_FUNCTION_NOT_SUPPORTED;
959
case ERROR_INET_EPROTOTYPE:
960
return SCE_KERNEL_ERROR_ERRNO_FILE_PROTOCOL;
961
case ERROR_INET_ENOTSOCK:
962
return SCE_KERNEL_ERROR_ERRNO_INVALID_FILE_DESCRIPTOR;
963
case ERROR_INET_ENOPROTOOPT:
964
return SCE_KERNEL_ERROR_ERRNO_FILE_PROTOCOL;
965
case ERROR_INET_ESHUTDOWN:
966
return SCE_KERNEL_ERROR_ERRNO_CLOSED;
967
case ERROR_INET_ECONNREFUSED:
968
return SCE_KERNEL_ERROR_ERRNO_FILE_ALREADY_EXISTS;
969
case ERROR_INET_EADDRINUSE:
970
return SCE_KERNEL_ERROR_ERRNO_FILE_ADDR_IN_USE;
971
case ERROR_INET_ECONNABORTED:
972
return SCE_KERNEL_ERROR_ERRNO_CONNECTION_ABORTED;
973
case ERROR_INET_ENETUNREACH:
974
return SCE_KERNEL_ERROR_ERRNO_DEVICE_NOT_FOUND;
975
case ERROR_INET_ENETDOWN:
976
return SCE_KERNEL_ERROR_ERRNO_CLOSED;
977
case ERROR_INET_ETIMEDOUT:
978
return SCE_KERNEL_ERROR_ERRNO_FILE_TIMEOUT;
979
case ERROR_INET_EHOSTDOWN:
980
return SCE_KERNEL_ERROR_ERRNO_CLOSED;
981
case ERROR_INET_EHOSTUNREACH:
982
return SCE_KERNEL_ERROR_ERRNO_DEVICE_NOT_FOUND;
983
case ERROR_INET_EALREADY:
984
return SCE_KERNEL_ERROR_ERRNO_ALREADY;
985
case ERROR_INET_EMSGSIZE:
986
return SCE_KERNEL_ERROR_ERRNO_FILE_IS_TOO_BIG;
987
case ERROR_INET_EPROTONOSUPPORT:
988
return SCE_KERNEL_ERROR_ERRNO_FUNCTION_NOT_SUPPORTED;
989
case ERROR_INET_ESOCKTNOSUPPORT:
990
return SCE_KERNEL_ERROR_ERRNO_FUNCTION_NOT_SUPPORTED;
991
case ERROR_INET_EADDRNOTAVAIL:
992
return SCE_KERNEL_ERROR_ERRNO_ADDRESS_NOT_AVAILABLE;
993
case ERROR_INET_ENETRESET:
994
return SCE_KERNEL_ERROR_ERRNO_CONNECTION_RESET;
995
case ERROR_INET_EISCONN:
996
return SCE_KERNEL_ERROR_ERRNO_ALREADY; // SCE_KERNEL_ERROR_ERRNO_IS_ALREADY_CONNECTED; // UNO only check for 0x80010077 and 0x80010078
997
case ERROR_INET_ENOTCONN:
998
return SCE_KERNEL_ERROR_ERRNO_NOT_CONNECTED;
999
case ERROR_INET_EAGAIN:
1000
return SCE_KERNEL_ERROR_ERRNO_RESOURCE_UNAVAILABLE; // SCE_ERROR_ERRNO_EAGAIN;
1001
#if !defined(_WIN32)
1002
case ERROR_INET_EINPROGRESS:
1003
return SCE_KERNEL_ERROR_ERRNO_IN_PROGRESS;
1004
#endif
1005
}
1006
if (error != 0)
1007
return hleLogError(Log::sceNet, error, "Unknown PSP Error Number (%d)", error);
1008
return error;
1009
}
1010
1011
1012
template <typename I>
1013
std::string num2hex(I w, size_t hex_len = sizeof(I) << 1) {
1014
static const char* digits = "0123456789ABCDEF";
1015
std::string rc(hex_len, '0');
1016
for (size_t i = 0, j = (hex_len - 1) * 4; i < hex_len; ++i, j -= 4)
1017
rc[i] = digits[(w >> j) & 0x0f];
1018
return rc;
1019
}
1020
1021
// Unused, might remove in the future.
1022
std::string convertNetError2str(uint32_t errorCode) {
1023
std::string str = "";
1024
if (((errorCode >> 31) & 1) != 0)
1025
str += "ERROR ";
1026
if (((errorCode >> 30) & 1) != 0)
1027
str += "CRITICAL ";
1028
switch ((errorCode >> 16) & 0xfff) {
1029
case 0x41:
1030
str += "NET ";
1031
break;
1032
default:
1033
str += "UNK" + num2hex(u16((errorCode >> 16) & 0xfff), 3) + " ";
1034
}
1035
switch ((errorCode >> 8) & 0xff) {
1036
case 0x00:
1037
str += "COMMON ";
1038
break;
1039
case 0x01:
1040
str += "CORE ";
1041
break;
1042
case 0x02:
1043
str += "INET ";
1044
break;
1045
case 0x03:
1046
str += "POECLIENT ";
1047
break;
1048
case 0x04:
1049
str += "RESOLVER ";
1050
break;
1051
case 0x05:
1052
str += "DHCP ";
1053
break;
1054
case 0x06:
1055
str += "ADHOC_AUTH ";
1056
break;
1057
case 0x07:
1058
str += "ADHOC ";
1059
break;
1060
case 0x08:
1061
str += "ADHOC_MATCHING ";
1062
break;
1063
case 0x09:
1064
str += "NETCNF ";
1065
break;
1066
case 0x0a:
1067
str += "APCTL ";
1068
break;
1069
case 0x0b:
1070
str += "ADHOCCTL ";
1071
break;
1072
case 0x0c:
1073
str += "UNKNOWN1 ";
1074
break;
1075
case 0x0d:
1076
str += "WLAN ";
1077
break;
1078
case 0x0e:
1079
str += "EAPOL ";
1080
break;
1081
case 0x0f:
1082
str += "8021x ";
1083
break;
1084
case 0x10:
1085
str += "WPA ";
1086
break;
1087
case 0x11:
1088
str += "UNKNOWN2 ";
1089
break;
1090
case 0x12:
1091
str += "TRANSFER ";
1092
break;
1093
case 0x13:
1094
str += "ADHOC_DISCOVER ";
1095
break;
1096
case 0x14:
1097
str += "ADHOC_DIALOG ";
1098
break;
1099
case 0x15:
1100
str += "WISPR ";
1101
break;
1102
default:
1103
str += "UNKNOWN" + num2hex(u8((errorCode >> 8) & 0xff)) + " ";
1104
}
1105
str += num2hex(u8(errorCode & 0xff));
1106
return str;
1107
}
1108
1109