⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dhcpc.h

📁 Linux下DHCP Client的实现。
💻 H
字号:
// dhcpc.h
//

#ifndef __DHCPC_H__
#define __DHCPC_H__

//#include
#include <linux/if_ether.h>  //for ethhdr
#include <stdint.h>
#include "dhcpprotol.h"
#include "IntotoDNS.h"
#include "DhcpcMsg.h"	//

//#define INADDR_LOOPBACK 0x7f000001
#define BROADCAST_IP_ADDRESS 0xffffffff
#define DHCP_CLIENT_CONFIG_PORT 9000
#define MAX_INTERFACE_NAMELEN   16 
#define MAX_INTERFACE_NUM		16


//DHCPC Listen event config
#ifndef __WAG302TYPE_H__
#define TRUE 1
#define FALSE 0
#endif

#define MAX_FDS_TOPOLL		2
#define IPADDR_LEN			4

typedef uint32_t			ipaddr;
typedef	uint32_t			bool_t;

#ifndef	_NETINET_IN_H	// /usr/include/netinet/in.h
typedef uint32_t in_addr_t;
#endif


enum WaitEventType
{
	WAIT_DISCOVER = 0,
	WAIT_REQUEST,
	WAIT_INFORM
};
typedef struct DHCPWAITEvent_s
{
#define DEFAULT_DISCOVER_TIMEOUT	6
#define DEFAULT_REQUEST_TIMEOUT		6
	bool_t bStartWaitEvent;
	uint32_t iWaitStartTime;
	uint32_t iWaitTimeOutTime;
	bool_t iInitSet;
	enum WaitEventType EventType;
	int iIfIndex;//Interface 's index
	char cszIfName[MAX_INTERFACE_NAMELEN];
	struct DHCPClientBlock_s *pPointToBlock;	/*point to interface struct */
	bool_t fWillSend;
	uint32_t uiStartLeaseTime;
	int iTimeOutNums;
	int iSendNums;
	struct DHCPWAITEvent_s *Next;
}DHCPWAITEvent_t;

typedef struct DHCPClientBlock_s
{
	char cszIfName[MAX_INTERFACE_NAMELEN];
#define   MAX_VALID_MAC_ADDR_LEN   6
	uint8_t aucHwAddress[MAX_VALID_MAC_ADDR_LEN];
	uint32_t ulTransActionId;  //to identify
	uint8_t CurrentState;
	ipaddr LeasedIpAddress;
	ipaddr DHCPServerIpAddr;
	uint32_t ulLeasedTime;
	uint32_t ulStartLeaseTime;
	uint32_t ulRenewTmOut; 
	uint32_t ulRebindTmOut;
	uint32_t ulRemainingTime;	
	bool_t bUsed;
	bool_t bDHCPClientEnabled;
	//xhema 20041118
	int uiIfIndex;	//interface index
	bool_t bIfActive;	//if interface active state
	struct DhcpcIPSetting_t sAllocedStruct;		/*dhcp server alloced parma*/
	struct DhcpcIPSetting_t sDefaultConfigStruct;/*default parma */
	struct DHCPWAITEvent_s *pTimer;				/*interface's timeout point */
	//end
	//xhema 20041126
	bool_t bRequestToConnect;		//DHCP Client timeout will set default ip setting,but it still try to connect to dhcp server
	uint32_t ulLeaveTime;
	//end
	//xhema 20041201
	bool_t bSendArp;
	uint32_t ulLeaveArpSendTime;	//DHCP Client will send arp packet on minute to find ip clash
	struct DHCPClientBlock_s *next;
}DHCPClientBlock_t;

/* DHCP client Current state */
typedef enum DHCPClientCurrentStatus_t
{
	DHCP_CLIENT_INITIALIZED = 0,
	DHCP_CLIENT_SELECT,
	DHCP_CLIENT_REQUEST,
	DHCP_CLIENT_ARP_AWAIT,
	DHCP_CLIENT_BOUND,
	DHCP_CLIENT_RENEW,
	DHCP_CLIENT_REBIND,
	DHCP_CLIENT_STOP,
} DHCPClientCurrentStatus_t;

//udphdr
struct udphdr {
    uint16_t        source;     /* source port */
    uint16_t        dest;     /* destination port */
    int16_t         len;      /* udp length */
    uint16_t        check;       /* udp checksum */
};

#ifndef IPTOS_LOWDELAY
# define IPTOS_LOWDELAY          0x10
# define IPTOS_THROUGHPUT        0x08
# define IPTOS_RELIABILITY       0x04
# define IPTOS_LOWCOST           0x02
# define IPTOS_MINCOST           IPTOS_LOWCOST
#endif /* IPTOS_LOWDELAY */
//ip hdr
struct iphdr {
	uint8_t  ver:4,			/* version */
			 hlen:4;		/* header length */
	uint8_t  tos;		/* type of service */   //IPTOS_LOWDELAY
	int16_t	  tot_len;		/* total length */
	uint16_t id;		/* identification */
	int16_t	  frag_off;		/* fragment offset field */
#define	IP_DF 0x4000			/* dont fragment flag */
#define	IP_MF 0x2000			/* more fragments flag */
#define	IP_OFFMASK 0x1fff		/* mask for fragmenting bits */
	uint8_t  ttl;		/* time to live */
	uint8_t  protocol;			/* protocol */
	uint16_t check;		/* checksum */
	ipaddr saddr;
	ipaddr daddr; /* source and dest address */
};


//eth head struct
struct hardware
{
 uint8_t htype;
 uint8_t hlen;
 uint8_t haddr[6];
};
//arp head struct
struct arpheader
{
#define ARPHRD_ETHER	 1
#define ARPOP_REQUEST	 1
#define ARPOP_REPLY		 2
	uint16_t ar_hrd;
	uint16_t ar_pro;
	uint8_t ar_hlen;
	uint8_t ar_plen;
	uint16_t ar_op;
	uint8_t sha[6];
	uint8_t sip[4];
	//ipaddr sip;
	uint8_t tha[6];
	uint8_t tip[4];
	//ipaddr tip;
};

typedef enum ArpReplyType_t
{
	ARP_SUCCESS = 5000,
	ARP_HAVE_SAME_ADDR = 5001,
	ARP_ERROR = 5002
}ArpReplyType_t;

typedef enum ReturnValueType_t
{
	R_SUCCESS = 6000
}ReturnValueType_t;

typedef struct DHCPCIpAddressInfo_s
{
   ipaddr    ulClientIpAddress;
   uint16_t  usClientPort;
   ipaddr    ulServerIpAddress;
   uint16_t  usServerPort;
}DHCPCIpAddressInfo_t;

typedef struct DHCPClientFunctions{
	bool_t (*DHCPNetworkConfig)(const char *cszIfName, 
			struct DhcpcIPSetting_t	 *ConfigStruct);

	bool_t (*DhcpClientEnable)(const char *cszIfName);

	int (*SendPacket)(int8_t *cszIfName, uint8_t *data,
				uint32_t len, ipaddr source, ipaddr dest);

	void (*FillOptions)(const char *cszIfName, uint8_t *pData, uint32_t *ulDataLen, 
			uint8_t ucDHCPMsgType);

}DHCPClientFunctions_t;

void DHCPClientFillFunctions(DHCPClientFunctions_t *pEntry);

bool_t DHCPClientDefaultConfig(const char *cszIfName, 
			struct DhcpcIPSetting_t	 *ConfigStruct);

void DHCPCFillOptions(const char *cszIfName, 
					  uint8_t *pData, 
					  uint32_t *ulDataLen, 
					  uint8_t ucDHCPMsgType);

int DHCPClientReadPort68Message(void);

//packet Assembly
int32_t IGWCreateLpfSock(int8_t *cszIfName);
void make_discover(struct dhcp_packet *, DHCPClientBlock_t *);
int32_t ZCOM_IGWSendPacket(int8_t *cszIfName,
						   uint8_t *data,
						   uint32_t len, 
						   ipaddr source, 
						   ipaddr dest);

void DHCPCAddOptionsToPkt(uint8_t *caSendingPkt,
                            DHCPClientBlock_t *pCurCtxtBlock,
                            uint32_t  *ulTotLength,
                            uint8_t ucDHCPMsgType);

int DHCPClientGetOptionBuf( uint8_t   *pBuffer,
                        int32_t     iLength,
                        uint8_t   *DhcpMessageType,
                        ipaddr     *DHCPServerIpAddr,
                        uint32_t   *ulLeasedTime,
                        uint32_t   *ulRenewTmOut,
                        uint32_t   *ulRebindTmOut
                      ) ;

int DHCPClientGetParam(uint8_t	*pBuffer,
					   int32_t		iLength,
					   DhcpcIPSetting_t	 *ConfigStruct);

int DHCPClientSendDHCPRequest(DHCPClientBlock_t *pCurCtxtBlock);
int DHCPClientSendDHCPRelease(DHCPClientBlock_t *pCurCtxtBlock);
int DHCPClientSendDHCPDecline(DHCPClientBlock_t *pCurCtxtBlock);
int DHCPClientSelectDHCPOffer(DHCPClientBlock_t *pCurCtxtBlock);
int DHCPClientSelectDHCPDiscover(DHCPClientBlock_t *pCurCtxtBlock);

ArpReplyType_t DHCPClientSendArp(char *cszIfName, 
								uint8_t *shaddr, //source hardware addr
								uint8_t *thaddr, 
								ipaddr source, ipaddr dest
								);

void GetHwAddr(uint8_t *hw, const char *cszIfName);
bool_t  IsValidIP(in_addr_t ulIP);
void IGWAssembleEthernetHeader (uint8_t *buf, 
								int *bufix, 
								struct hardware *from,
								struct hardware *to);
void IGWAssembleUdpIpHeader(uint8_t *buf, 
							int32_t *bufix,
							ipaddr from, 
							ipaddr to,
							int32_t port,
							uint8_t *data,
							int32_t len);

void DHCPClientMonitor(void);
bool_t DHCPClientInit(void);
bool_t DHCPClientEnable(const char *cszIfName);
uint32_t checksum (uint8_t *buf,int nbytes,uint32_t sum);
uint32_t wrapsum (uint32_t sum);
int32_t DHCPClientActiveSocketFd(int32_t bActive);
bool_t InterfaceGatewaySet(const char *cszIfName, in_addr_t ulGateway);

bool_t IntotoStaticNameServerUpdate(
	in_addr_t	inDnsPrimary,
	in_addr_t	inDnsSecondary
	);
void IntotoStaticNameServerRemoveAll(void);
bool_t IntotoStaticNameServerAdd(in_addr_t ulIP);

int DHCPClientSendDHCPDiscover(DHCPClientBlock_t *pCurCtxtBlock);
void DHCPClientUpdateIfStatus(DHCPWAITEvent_t *pEvent);
int DHCPClientDiscoverTimeoutProcess(DHCPWAITEvent_t *p, 	DHCPClientBlock_t *pCurCtxtBlock);
int DHCPClientRequestTimeoutProcess(DHCPWAITEvent_t *p);

#endif//__DHCPC_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -