X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FIPStack%2Fipv4.h;h=33507b28f568f5f4d0fb26f4ec7ff1fe7c4a73c9;hb=b1873b4cff47aae8ada8cc303ea01b475cc7ccc8;hp=67b3dc83252882a4307b2773d91aa571e3d50a25;hpb=6c5a509b5e14e097ca537c539bc9babe3b8f0c4c;p=tpg%2Facess2.git diff --git a/Modules/IPStack/ipv4.h b/Modules/IPStack/ipv4.h index 67b3dc83..33507b28 100644 --- a/Modules/IPStack/ipv4.h +++ b/Modules/IPStack/ipv4.h @@ -12,9 +12,10 @@ typedef struct sIPv4Header tIPv4Header; struct sIPv4Header { struct { - unsigned Version: 4; // = 4 + // Spec says Version is first, but stupid bit ordering unsigned HeaderLength: 4; // in 4-byte chunks - }; + unsigned Version: 4; // = 4 + } __attribute__((packed)); Uint8 DiffServices; // Differentiated Services Uint16 TotalLength; Uint16 Identifcation; @@ -24,10 +25,10 @@ struct sIPv4Header unsigned DontFragment: 1; unsigned MoreFragments: 1; unsigned FragOffLow: 5; - }; + } __attribute__((packed)); Uint8 FragOffHi; // Number of 8-byte blocks from the original start - Uint8 TTL; // Max number of hops effectively + Uint8 TTL; // Max number of hops, effectively Uint8 Protocol; Uint16 HeaderChecksum; // One's Complement Sum of the entire header must equal zero @@ -35,12 +36,17 @@ struct sIPv4Header tIPv4 Destination; Uint8 Options[]; -}; +} __attribute__((packed)); #define IP4PROT_ICMP 1 -#define IP4PROT_TCP 6 -#define IP4PROT_UDP 17 +#define IP4PROT_TCP 6 +#define IP4PROT_UDP 17 #define IPV4_ETHERNET_ID 0x0800 +// === FUNCTIONS === +extern int IPv4_RegisterCallback(int ID, tIPCallback Callback); +extern Uint16 IPv4_Checksum(const void *Buf, int Size); +extern int IPv4_SendPacket(tInterface *Iface, tIPv4 Address, int Protocol, int ID, int Length, const void *Data); + #endif