Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions include/dolphin/ip.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#ifndef __DOLPHIN_OS_IP_H__
#define __DOLPHIN_OS_IP_H__

#include <dolphin/ip/IFQueue.h>
#include <dolphin/ip/IP.h>
#include <dolphin/ip/IPIgmp.h>
#include <dolphin/ip/IPIcmp.h>
#include <dolphin/ip/IPRoute.h>
#include <dolphin/ip/IPTcpTimeWait.h>
#include <dolphin/ip/IPOpt.h>
#include <dolphin/ip/IPFrag.h>
#include <dolphin/ip/IPTcp.h>
#include <dolphin/ip/IPUdp.h>
#include <dolphin/ip/IPSocket.h>
#include <dolphin/ip/IFFifo.h>
#include <dolphin/ip/IPDns.h>
#include <dolphin/ip/IPPpp.h>
#include <dolphin/ip/IPDhcp.h>
#include <dolphin/ip/IPEther.h>

#ifdef __cplusplus
extern "C" {
#endif

#define IPU32(ipBytes) (*(u32*)(ipBytes))
#define IPEQ(ip0, ip1) (IPU32(ip0) == IPU32(ip1))
#define IPNEQ(ip0, ip1) (IPU32(ip0) != IPU32(ip1))

#define IP_CLASSA(ip) (((ip)[0] & 0x80) == 0x00) /* 0 - 127 */
#define IP_CLASSB(ip) (((ip)[0] & 0xC0) == 0x80) /* 128 - 191 */
#define IP_CLASSC(ip) (((ip)[0] & 0xE0) == 0xC0) /* 192 - 223 */
#define IP_CLASSD(ip) (((ip)[0] & 0xF0) == 0xE0) /* 224 - 239 | Multicasting */
#define IP_CLASSE(ip) (((ip)[0] & 0xF8) == 0xF0) /* 240 - 255 | Experimental */

extern const u8 IPAddrAny[4];

char* IPAtoN(const char* dotted, u8* addr);
char* IPNtoA(const u8* addr);
BOOL IPRecoverGateway(const u8* dst);
BOOL IPAutoConfig(void);
s32 IPSetConfigError(IPInterface* interface, s32 err);

#ifdef __cplusplus
}
#endif

#endif
39 changes: 39 additions & 0 deletions include/dolphin/ip/IFFifo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#ifndef __DOLPHIN_OS_IP_IFFIFO_H__
#define __DOLPHIN_OS_IP_IFFIFO_H__

#include <dolphin/ip/IP.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct IFBlock {
// total size: 0x8
u8* ptr; // offset 0x0, size 0x4
s32 len; // offset 0x4, size 0x4
} IFBlock;

typedef struct IFFifo {
// total size: 0x10
u8* buff; // offset 0x0, size 0x4
s32 size; // offset 0x4, size 0x4
u8* head; // offset 0x8, size 0x4
s32 used; // offset 0xC, size 0x4
} IFFifo;

void IFFifoInit(IFFifo* fifo, void* buff, s32 size);
void * IFFifoAlloc(IFFifo* fifo, s32 len);
BOOL IFFifoFree(IFFifo* fifo, void* ptr, s32 len);
void IFDump(void* ptr, s32 len);

u8* IFRingIn(u8* buf, s32 size, u8* head, s32 used, const u8* data, s32 len);
u8* IFRingOut(u8* buf, s32 size, u8* head, s32 used, u8* data, s32 len);
int IFRingGet(u8* buf, s32 size, u8* head, s32 used, IFVec* vec, s32 len);
u8* IFRingPut(u8* buf, s32 size, u8* head, s32 used, s32 len);
u8* IFRingInEx(u8* buf, s32 size, u8* head, s32 used, s32 offset, const u8* data, s32 * adv, IFBlock* blockTable, s32 maxblock);

#ifdef __cplusplus
}
#endif

#endif
202 changes: 202 additions & 0 deletions include/dolphin/ip/IFQueue.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
#ifndef __DOLPHIN_OS_IF_QUEUE_H__
#define __DOLPHIN_OS_IF_QUEUE_H__

#include <dolphin/types.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct IFQueue IFQueue;
typedef struct IFQueue IFLink;

struct IFQueue {
// total size: 0x8
IFQueue* next; // offset 0x0, size 0x4
IFQueue* prev; // offset 0x4, size 0x4
};

#define IFQueueInit(queue) ((queue)->next = (queue)->prev = 0)
#define IFIsEmptyQueue(queue) ((queue)->next == 0)

#define IFQueueIterator(type, queue, iter, n) \
for ((iter) = (type)((queue)->next), (n) = ((iter) == 0) ? 0 : (type)(iter)->link.next; \
(iter) != 0; \
(iter) = (n), (n) = ((iter) == 0) ? 0 : (type)(iter)->link.next)

#define IFQueueReverseIterator(type, queue, iter, p) \
for ((iter) = (type)((queue)->prev), (p) = ((iter) == 0) ? 0 : (type)(iter)->link.prev; \
(iter) != 0; \
(iter) = (p), (p) = ((iter) == 0) ? 0 : (type)(iter)->link.prev)

#define IFQueueDequeueEntry(type, queue, entry) \
do { \
register IFQueue* ___next; \
register IFQueue* ___prev; \
\
___next = (entry)->link.next; \
___prev = (entry)->link.prev; \
\
if (___next == 0) { \
(queue)->prev = ___prev; \
} else { \
((type)___next)->link.prev = ___prev; \
} \
if (___prev == 0){ \
(queue)->next = ___next; \
} else { \
((type)___prev)->link.next = ___next; \
} \
} while (0)

#define IFQueueDequeueHead(type, queue, entry) \
do { \
register IFQueue* ___next; \
\
(entry) = (type)(queue)->next; \
___next = ((type)(entry))->link.next; \
\
if (___next == 0) { \
(queue)->prev = 0; \
} else { \
((type)___next)->link.prev = 0; \
} \
(queue)->next = ___next; \
} while (0)

#define IFQueueDequeueTail(type, queue, entry) \
do { \
register IFQueue* ___prev; \
\
(entry) = (type)(queue)->prev; \
___prev = ((type)(entry))->link.prev; \
\
if (___prev == 0) { \
(queue)->next = 0; \
} else { \
((type)___prev)->link.next = 0; \
} \
(queue)->prev = ___prev; \
} while (0)

#define IFQueueEnqueueHead(type, queue, entry) \
do { \
register IFQueue* ___next; \
\
___next = (queue)->next; \
\
if (___next == 0) { \
(queue)->prev = (IFQueue*)(entry); \
} else { \
((type)___next)->link.prev = (IFQueue*)(entry); \
} \
(entry)->link.next = ___next; \
(entry)->link.prev = 0; \
(queue)->next = (IFQueue*)(entry); \
} while (0)

#define IFQueueEnqueueTail(type, queue, entry) \
do { \
register IFQueue* ___prev; \
\
___prev = (queue)->prev; \
\
if (___prev == 0) { \
(queue)->next = (IFQueue*)(entry); \
} else { \
((type)___prev)->link.next = (IFQueue*)(entry); \
} \
(entry)->link.prev = ___prev; \
(entry)->link.next = 0; \
(queue)->prev = (IFQueue*)(entry); \
} while (0)

/* Macros where you can set the link member name */

#define IFQueueDequeueEntryLINK(type, queue, link, entry) \
do { \
register IFQueue* ___next; \
register IFQueue* ___prev; \
\
___next = (entry)->link.next; \
___prev = (entry)->link.prev; \
\
if (___next == 0) { \
(queue)->prev = ___prev; \
} else { \
((type)___next)->link.prev = ___prev; \
} \
if (___prev == 0){ \
(queue)->next = ___next; \
} else { \
((type)___prev)->link.next = ___next; \
} \
} while (0)

#define IFQueueDequeueHeadLINK(type, queue, link, entry) \
do { \
register IFQueue* ___next; \
\
(entry) = (type)(queue)->next; \
___next = ((type)(entry))->link.next; \
\
if (___next == 0) { \
(queue)->prev = 0; \
} else { \
((type)___next)->link.prev = 0; \
} \
(queue)->next = ___next; \
} while (0)

#define IFQueueDequeueTailLINK(type, queue, link, entry) \
do { \
register IFQueue* ___prev; \
\
(entry) = (type)(queue)->prev; \
___prev = ((type)(entry))->link.prev; \
\
if (___prev == 0) { \
(queue)->next = 0; \
} else { \
((type)___prev)->link.next = 0; \
} \
(queue)->prev = ___prev; \
} while (0)

#define IFQueueEnqueueHeadLINK(type, queue, link, entry) \
do { \
register IFQueue* ___next; \
\
___next = (queue)->next; \
\
if (___next == 0) { \
(queue)->prev = (IFQueue*)(entry); \
} else { \
((type)___next)->link.prev = (IFQueue*)(entry); \
} \
(entry)->link.next = ___next; \
(entry)->link.prev = 0; \
(queue)->next = (IFQueue*)(entry); \
} while (0)

#define IFQueueEnqueueTailLINK(type, queue, link, entry) \
do { \
register IFQueue* ___prev; \
\
___prev = (queue)->prev; \
\
if (___prev == 0) { \
(queue)->next = (IFQueue*)(entry); \
} else { \
((type)___prev)->link.next = (IFQueue*)(entry); \
} \
(entry)->link.prev = ___prev; \
(entry)->link.next = 0; \
(queue)->prev = (IFQueue*)(entry); \
} while (0)

#ifdef __cplusplus
}
#endif

#endif
67 changes: 67 additions & 0 deletions include/dolphin/ip/IPArp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#ifndef __DOLPHIN_OS_IP_ARP_H__
#define __DOLPHIN_OS_IP_ARP_H__

#include <dolphin/ip/IP.h>
#include <dolphin/ip/IPEther.h>

#ifdef __cplusplus
extern "C" {
#endif

#define ARP_FOUND 0
#define ARP_LOOPBACK 1
#define ARP_BROADCAST 2
#define ARP_MULTICAST 3
#define ARP_NOTFOUND -1

#define ARP_CACHE_RESOVLED 2
#define ARP_CACHE_POLLING 3

typedef struct ARPCache {
// total size: 0xA8
IFQueue link; // offset 0x0, size 0x8
OSAlarm alarm; // offset 0x8, size 0x28
int rxmit; // offset 0x30, size 0x4
int state; // offset 0x34, size 0x4
u8 hwAddr[6]; // offset 0x38, size 0x6
u8 prAddr[4]; // offset 0x3E, size 0x4
IPInterface* interface; // offset 0x44, size 0x4
IFDatagram datagram; // offset 0x48, size 0x3C
u8 arp[28]; // offset 0x84, size 0x1C
IFQueue queue; // offset 0xA0, size 0x8
} ARPCache;

typedef struct ARPHeader {
// total size: 0x8
u16 hwType; // offset 0x0, size 0x2
u16 prType; // offset 0x2, size 0x2
u8 hwAddrLen; // offset 0x4, size 0x1
u8 prAddrLen; // offset 0x5, size 0x1
u16 opCode; // offset 0x6, size 0x2
} ARPHeader;

#define ARPHeader2MACAddr(header) ((u8*)(header) + sizeof(ARPHeader))
#define ARPHeader2PrAddr(header) ((u8*)(header) + sizeof(ARPHeader) + (header)->hwAddrLen)
#define ArpHeader2HwAddr(header) ((u8*)(header) + sizeof(ARPHeader) + header->hwAddrLen + header->prAddrLen)
#define ARPHeader2Addr(header) ((u8*)(header) + sizeof(ARPHeader) + 2 * (header)->hwAddrLen + (header)->prAddrLen)

void ARPDumpPacket(const ETHHeader* eh, s32 len);
void ARPDump(void);
void ARPInit(void);
s32 ARPLookup(IPInterface* interface, u8* prAddr, u8* hwAddr);
void ARPRevalidate(u8* prAddr);
void ARPAdd(IPInterface* interface, u8* prAddr, u8* hwAddr);
void ARPHold(IPInterface* interface, struct IFDatagram * datagram);
void ARPOut(IPInterface* interface, u16 opCode, const u8* dstPrAddr, const u8* dstHwAddr, const u8* srcPrAddr, ARPCache* cache);
void ARPGratuitous(IPInterface* interface);
void ARPProbe(IPInterface* interface, u8* prAddr);
void ARPClaim(IPInterface* interface, IPInterfaceConf* conf);
void ARPIn(IPInterface* interface, ETHHeader* eh, s32 len);
void ARPRefresh(void);

#ifdef __cplusplus
}
#endif

#endif

35 changes: 35 additions & 0 deletions include/dolphin/ip/IPDhcp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#ifndef __DOLPHIN_OS_IP_DHCP_H__
#define __DOLPHIN_OS_IP_DHCP_H__

#include <dolphin/ip/IP.h>

#ifdef __cplusplus
extern "C" {
#endif

#define DHCP_OPT_DNS 6

typedef struct DHCPInfo {
// total size: 0x12C
u8 ipaddr[4]; // offset 0x0, size 0x4
u8 netmask[4]; // offset 0x4, size 0x4
u8 router[4]; // offset 0x8, size 0x4
u8 dns1[4]; // offset 0xC, size 0x4
u8 dns2[4]; // offset 0x10, size 0x4
char domain[256]; // offset 0x114, size 0x100
u16 mtu; // offset 0x114, size 0x2
u8 broadcast[4]; // offset 0x116, size 0x4
u8 lease; // offset 0x11C, size 0x4
u8 server[4]; // offset 0x120, size 0x4
u8 renewal; // offset 0x124, size 0x4
u8 rebinding; // offset 0x128, size 0x4
} DHCPInfo;

int DHCPGetOpt(int opt, void* buf, int len);
BOOL DHCPGetStatus(DHCPInfo * info /* r28 */);

#ifdef __cplusplus
}
#endif

#endif
Loading
Loading