1 #ifndef IHEADER_H_INCLUDED
2 #define IHEADER_H_INCLUDED
3 
4 #include "dnsrelated.h"
5 #include "utils.h"
6 
7 typedef struct _IHeader IHeader;
8 
9 struct _IHeader{
10 	int32_t _Pad; /* Must be 0 */
11 
12 	Address_Type    BackAddress;
13 	SOCKET          SendBackSocket;
14 
15 	char	        Domain[256];
16 	int             HashValue;
17 	DNSRecordType   Type;
18 
19 	BOOL            ReturnHeader;
20 	BOOL		    EDNSEnabled;
21 
22 	int             EntityLength;
23 
24 	char            Agent[ROUND_UP(LENGTH_OF_IPV6_ADDRESS_ASCII + 1,
25                                    sizeof(void *)
26                                    )
27                           ];
28 
29     void            *TcpLengthPadding;
30 };
31 
32 #define IHEADER_TAIL(ptr)   (void *)((IHeader *)(ptr) + 1)
33 
34 #define IHEADER_CONTAINING_HEADER(ptr)  (((IHeader *)(ptr))->_Pad == 0)
35 
36 int IHeader_Init(BOOL _ap);
37 
38 void IHeader_Reset(IHeader *h);
39 
40 int IHeader_Fill(IHeader *h,
41                  BOOL ReturnHeader,
42                  char *DnsEntity,
43                  int EntityLength,
44                  struct sockaddr *BackAddress,
45                  SOCKET SendBackSocket,
46                  sa_family_t Family,
47                  const char *Agent
48                  );
49 
50 int IHeader_AddFakeEdns(IHeader *h, int BufferLength);
51 
52 BOOL IHeader_Blocked(IHeader *h /* Entity followed */);
53 
54 int IHeader_SendBack(IHeader *h /* Entity followed */);
55 
56 int IHeader_SendBackRefusedMessage(IHeader *h);
57 
58 #endif // IHEADER_H_INCLUDED
59