Multiple IPStack Related changes (and other bugfixes)
[tpg/acess2.git] / Modules / IPStack / ipstack.h
index 94fabbb..071c62b 100644 (file)
@@ -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));
@@ -31,35 +39,59 @@ struct sMacAddr {
 } __attribute__((packed));
 
 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
+       
+       char    Name[];
 };
 
+/**
+ * \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;
+
 /**
  * \brief Represents a network adapter
  */
 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}};
@@ -68,16 +100,22 @@ static const tMacAddr cMAC_BROADCAST = {{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}};
 #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, void *Address1, void *Address2, int CheckBits);
+
+extern tRoute  *IPStack_FindRoute(int AddressType, tInterface *Interface, void *Address);
 
 #endif

UCC git Repository :: git.ucc.asn.au