X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Modules%2FIPStack%2Fipstack.h;h=e51fded928ca6f9b93d1bc54f214673480268a7f;hb=a79a695585e69376330fd6b83b32a573d7df9dc7;hp=94fabbb5d346a7e5029c6172b4309fb4c08b9083;hpb=a4ce2e60f783c9e71447edc03f20f937b8abf35a;p=tpg%2Facess2.git diff --git a/Modules/IPStack/ipstack.h b/Modules/IPStack/ipstack.h index 94fabbb5..e51fded9 100644 --- a/Modules/IPStack/ipstack.h +++ b/Modules/IPStack/ipstack.h @@ -13,15 +13,23 @@ typedef union uIPv6 tIPv6; typedef struct sMacAddr tMacAddr; typedef struct sAdapter tAdapter; typedef struct sInterface tInterface; +typedef struct sSocketFile tSocketFile; typedef void (*tIPCallback)(tInterface *Interface, void *Address, int Length, void *Buffer); +enum eInterfaceTypes { + AF_NULL, + AF_INET4 = 4, // tIPv4 + AF_INET6 = 6 // tIPv6 +}; + union uIPv4 { Uint32 L; Uint8 B[4]; } __attribute__((packed)); union uIPv6 { + Uint16 W[8]; Uint32 L[4]; Uint8 B[16]; } __attribute__((packed)); @@ -30,23 +38,37 @@ struct sMacAddr { Uint8 B[6]; } __attribute__((packed)); +/** + * \brief Route definition structure + */ +typedef struct sRoute { + struct sRoute *Next; + + tVFS_Node Node; //!< Node for route manipulation + + tInterface *Interface; //!< Interface for this route + int AddressType; //!< 0: Invalid, 4: IPv4, 6: IPv4 + void *Network; //!< Network - Pointer to tIPv4/tIPv6/... at end of structure + int SubnetBits; //!< Number of bits in \a Network that are valid + void *NextHop; //!< Next Hop address - Pointer to tIPv4/tIPv6/... at end of structure + int Metric; //!< Route priority +} tRoute; + struct sInterface { - struct sInterface *Next; - tVFS_Node Node; - tAdapter *Adapter; - int Type; // 0 for disabled, 4 for IPv4 and 6 for IPv6 - union { - struct { - tIPv6 Address; - int SubnetBits; //Should this be outside the union? - } IP6; - - struct { - tIPv4 Address; - tIPv4 Gateway; - int SubnetBits; - } IP4; - }; + struct sInterface *Next; //!< Next interface in list + + tVFS_Node Node; //!< Node to use the interface + + tAdapter *Adapter; //!< Adapter the interface is associated with + int TimeoutDelay; //!< Time in miliseconds before a packet times out + int Type; //!< Interface type, see ::eInterfaceTypes + + void *Address; //!< IP address (stored after the Name) + int SubnetBits; //!< Number of bits that denote the address network + + tRoute Route; //!< Interface route + + char Name[]; }; /** @@ -55,29 +77,49 @@ struct sInterface { struct sAdapter { struct sAdapter *Next; - int DeviceFD; - int NRef; + int DeviceFD; //!< File descriptor of the device + int NRef; //!< Number of times it's been referenced - tMacAddr MacAddr; - char Device[]; + tMacAddr MacAddr; //!< Physical address of the adapter + int DeviceLen; //!< Device name length + char Device[]; //!< Device name +}; + +/** + * \brief Describes a socket file definition + */ +struct sSocketFile +{ + struct sSocketFile *Next; + const char *Name; + + tVFS_Node *(*Init)(tInterface *Interface); }; static const tMacAddr cMAC_BROADCAST = {{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}}; +static const tMacAddr cMAC_ZERO = {{0x00,0x00,0x00,0x00,0x00,0x00}}; #define MAC_SET(t,v) memcpy(&(t),&(v),sizeof(tMacAddr)) #define IP4_SET(t,v) (t).L = (v).L; #define IP6_SET(t,v) memcpy(&(t),&(v),sizeof(tIPv6)) -#define MAC_EQU(a,b) memcmp(&(a),&(b),sizeof(tMacAddr)) +#define MAC_EQU(a,b) (memcmp(&(a),&(b),sizeof(tMacAddr))==0) #define IP4_EQU(a,b) ((a).L==(b).L) -#define IP6_EQU(a,b) memcmp(&(a),&(b),sizeof(tIPv6)) +#define IP6_EQU(a,b) (memcmp(&(a),&(b),sizeof(tIPv6))==0) // === FUNCTIONS === #define htonb(v) (v) -#define htons(in) BigEndian16(in) -#define htonl(in) BigEndian32(in) +#define htons(v) BigEndian16(v) +#define htonl(v) BigEndian32(v) #define ntonb(v) (v) -#define ntohs(in) BigEndian16(in) -#define ntohl(in) BigEndian32(in) +#define ntohs(v) BigEndian16(v) +#define ntohl(v) BigEndian32(v) + +extern int IPStack_AddFile(tSocketFile *File); +extern int IPStack_GetAddressSize(int AddressType); +extern int IPStack_CompareAddress(int AddressType, const void *Address1, const void *Address2, int CheckBits); +extern const char *IPStack_PrintAddress(int AddressType, const void *Address); + +extern tRoute *IPStack_FindRoute(int AddressType, tInterface *Interface, void *Address); #endif