added qse_ip6adxx_t with address classification functions
defined data types and routines and dhcpv6 messages
This commit is contained in:
		| @ -166,7 +166,7 @@ am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/README.in \ | |||||||
| 	$(top_srcdir)/ac/config.guess $(top_srcdir)/ac/config.sub \ | 	$(top_srcdir)/ac/config.guess $(top_srcdir)/ac/config.sub \ | ||||||
| 	$(top_srcdir)/ac/install-sh $(top_srcdir)/ac/ltmain.sh \ | 	$(top_srcdir)/ac/install-sh $(top_srcdir)/ac/ltmain.sh \ | ||||||
| 	$(top_srcdir)/ac/missing ac/ar-lib ac/compile ac/config.guess \ | 	$(top_srcdir)/ac/missing ac/ar-lib ac/compile ac/config.guess \ | ||||||
| 	ac/config.sub ac/depcomp ac/install-sh ac/ltmain.sh ac/missing | 	ac/config.sub ac/install-sh ac/ltmain.sh ac/missing | ||||||
| DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) | DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) | ||||||
| distdir = $(PACKAGE)-$(VERSION) | distdir = $(PACKAGE)-$(VERSION) | ||||||
| top_distdir = $(distdir) | top_distdir = $(distdir) | ||||||
|  | |||||||
| @ -40,6 +40,35 @@ struct qse_ip4ad_t | |||||||
| 	qse_uint32_t value; | 	qse_uint32_t value; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | struct qse_ip6ad_t | ||||||
|  | { | ||||||
|  | 	qse_uint8_t value[16]; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | #define QSE_IP4AD_IS_LOOPBACK(addr) ((((addr)->value) & QSE_CONST_HTON32(0xFF000000)) == QSE_CONST_HTON32(0x7F000000)) | ||||||
|  |  | ||||||
|  | #define QSE_IP6AD_IS_LOOPBACK(addr) \ | ||||||
|  | 		((addr)->value[0] == 0 && (addr)->value[1] == 0 && \ | ||||||
|  | 		 (addr)->value[2] == 0 && (addr)->value[3] == 0 && \ | ||||||
|  | 		 (addr)->value[4] == 0 && (addr)->value[5] == 0 && \ | ||||||
|  | 		 (addr)->value[6] == 0 && (addr)->value[7] == 0 && \ | ||||||
|  | 		 (addr)->value[8] == 0 && (addr)->value[9] == 0 && \ | ||||||
|  | 		 (addr)->value[10] == 0 && (addr)->value[11] == 0 && \ | ||||||
|  | 		 (addr)->value[12] == 0 && (addr)->value[13] == 0 && \ | ||||||
|  | 		 (addr)->value[14] == 0 && (addr)->value[15] == 1) | ||||||
|  |  | ||||||
|  | // FE80::/10 | ||||||
|  | #define QSE_IP6AD_IS_LINK_LOCAL(addr) (this->value[0] == 0xFE && (this->value[1] & 0xC0) == 0x80) | ||||||
|  | // FEC0::/10 | ||||||
|  | #define QSE_IP6AD_IS_SITE_LOCAL(addr) (this->value[0] == 0xFE && (this->value[1] & 0xC0) == 0xC0) | ||||||
|  |  | ||||||
|  | #define QSE_IP6AD_IS_MULTICAST(addr) ((addr)->value[0] == 0xFF) | ||||||
|  | #define QSE_IP6AD_IS_MULTICAST_LINK_LOCAL(addr) ((addr)->value[0] == 0xFF && ((addr)->value[1] & 0x0F) == 0x02) | ||||||
|  | #define QSE_IP6AD_IS_MULTICAST_SITE_LOCAL(addr) ((addr)->value[0] == 0xFF && ((addr)->value[1] & 0x0F) == 0x05) | ||||||
|  | #define QSE_IP6AD_IS_MULTICAST_ORGANIZATION(addr) ((addr)->value[0] == 0xFF && ((addr)->value[1] & 0x0F) == 0x08) | ||||||
|  | #define QSE_IP6AD_IS_MULTICAST_GLOBAL(addr) ((addr)->value[0] == 0xFF && ((addr)->value[1] & 0x0F) == 0x0E) | ||||||
|  | #define QSE_IP6AD_IS_MULTICAST_INTERFACE_LOCAL(addr) ((addr)->value[0] == 0xFF && ((addr)->value[1] & 0x0F) == 0x01) | ||||||
|  |  | ||||||
| #if defined(__cplusplus) | #if defined(__cplusplus) | ||||||
| struct qse_ip4adxx_t: public qse_ip4ad_t | struct qse_ip4adxx_t: public qse_ip4ad_t | ||||||
| { | { | ||||||
| @ -111,15 +140,132 @@ struct qse_ip4adxx_t: public qse_ip4ad_t | |||||||
| 		return x; | 		return x; | ||||||
| 	} | 	} | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | struct qse_ip6adxx_t: public qse_ip6ad_t | ||||||
|  | { | ||||||
|  | 	struct ad64_t | ||||||
|  | 	{ | ||||||
|  | 		qse_uint64_t w[2]; | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	qse_ip6adxx_t () | ||||||
|  | 	{ | ||||||
|  | 		register ad64_t* x = (ad64_t*)this->value; | ||||||
|  | 		x->w[0] = 0; | ||||||
|  | 		x->w[1] = 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	qse_ip6adxx_t (qse_uint8_t (*value)[16]) | ||||||
|  | 	{ | ||||||
|  | 		register ad64_t* x = (ad64_t*)this->value; | ||||||
|  | 		x->w[0] = ((ad64_t*)value)->w[0]; | ||||||
|  | 		x->w[1] = ((ad64_t*)value)->w[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	qse_ip6adxx_t (qse_uint8_t (&value)[16]) | ||||||
|  | 	{ | ||||||
|  | 		register ad64_t* x = (ad64_t*)this->value; | ||||||
|  | 		x->w[0] = ((ad64_t*)&value)->w[0]; | ||||||
|  | 		x->w[1] = ((ad64_t*)&value)->w[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool operator== (const qse_ip4adxx_t& peer) const  | ||||||
|  | 	{ | ||||||
|  | 		register ad64_t* x = (ad64_t*)this->value; | ||||||
|  | 		register ad64_t* y = (ad64_t*)&peer.value; | ||||||
|  | 		return x->w[0] == y->w[0] && x->w[1] == y->w[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool operator!= (const qse_ip4adxx_t& peer) const  | ||||||
|  | 	{ | ||||||
|  | 		register ad64_t* x = (ad64_t*)this->value; | ||||||
|  | 		register ad64_t* y = (ad64_t*)&peer.value; | ||||||
|  | 		return x->w[0] != y->w[0] || x->w[1] != y->w[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	qse_ip6adxx_t& operator= (const qse_ip6adxx_t& v) | ||||||
|  | 	{ | ||||||
|  | 		register ad64_t* x = (ad64_t*)this->value; | ||||||
|  | 		x->w[0] = ((ad64_t*)&v)->w[0]; | ||||||
|  | 		x->w[1] = ((ad64_t*)&v)->w[1]; | ||||||
|  | 		return *this; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool isZero() const | ||||||
|  | 	{ | ||||||
|  | 		register ad64_t* x = (ad64_t*)this->value; | ||||||
|  | 		return x->w[0] == 0 && x->w[1] == 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool isLoopback() const | ||||||
|  | 	{ | ||||||
|  | 		return QSE_IP6AD_IS_LOOPBACK(this); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool isLinkLocal() const | ||||||
|  | 	{ | ||||||
|  | 		// FE80::/10 | ||||||
|  | 		return QSE_IP6AD_IS_LINK_LOCAL(this); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool isSiteLocal() const | ||||||
|  | 	{ | ||||||
|  | 		// FEC0::/10 | ||||||
|  | 		return QSE_IP6AD_IS_SITE_LOCAL(this); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// multicast addresses | ||||||
|  | 	// ff02:: Link Local: spans the same topological region as the corresponding unicast scope, i.e. all nodes on the same LAN. | ||||||
|  | 	// ff05:: Site local: is intended to span a single site | ||||||
|  | 	// ff08:: Organization scope: Intended to span multiple sizes within the same organization | ||||||
|  | 	// ff0e:: Global scope, assigned by IANA. | ||||||
|  | 	// ff01:: Interface local: Spans only a single interface on a node and is useful only for loopback transmission of multicast. | ||||||
|  | 	bool isMulticast() const | ||||||
|  | 	{ | ||||||
|  | 		return QSE_IP6AD_IS_MULTICAST(this); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool isMulticastLinkLocal() const | ||||||
|  | 	{ | ||||||
|  | 		return QSE_IP6AD_IS_MULTICAST_LINK_LOCAL(this); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool isMulticastSiteLocal() const | ||||||
|  | 	{ | ||||||
|  | 		return QSE_IP6AD_IS_MULTICAST_SITE_LOCAL(this); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool isMulticastOrganization() const | ||||||
|  | 	{ | ||||||
|  | 		return QSE_IP6AD_IS_MULTICAST_ORGANIZATION(this); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool isMulticastGlobal() const | ||||||
|  | 	{ | ||||||
|  | 		return QSE_IP6AD_IS_MULTICAST_GLOBAL(this); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool isMulticastInterfaceLocal() const | ||||||
|  | 	{ | ||||||
|  | 		return QSE_IP6AD_IS_MULTICAST_INTERFACE_LOCAL(this); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	bool isV4Mapped () const | ||||||
|  | 	{ | ||||||
|  | 		return this->value[0] == 0x00 && this->value[1] == 0x00 && | ||||||
|  | 		       this->value[2] == 0x00 && this->value[3] == 0x00 && | ||||||
|  | 		       this->value[4] == 0x00 && this->value[5] == 0x00 && | ||||||
|  | 		       this->value[6] == 0x00 && this->value[7] == 0x00 && | ||||||
|  | 		       this->value[8] == 0x00 && this->value[9] == 0x00 && | ||||||
|  | 		       this->value[10] == 0xFF && this->value[11] == 0xFF; | ||||||
|  | 	} | ||||||
|  | }; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| struct qse_ip6ad_t |  | ||||||
| { |  | ||||||
| 	qse_uint8_t value[16]; |  | ||||||
| }; |  | ||||||
| #include <qse/unpack.h> | #include <qse/unpack.h> | ||||||
|  |  | ||||||
| #define QSE_IP4AD_IN_LOOPBACK(addr) ((((addr)->value) & QSE_CONST_HTON32(0xFF000000)) == QSE_CONST_HTON32(0x7F000000)) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #if defined(__cplusplus) | #if defined(__cplusplus) | ||||||
| extern "C" { | extern "C" { | ||||||
|  | |||||||
| @ -1,5 +1,7 @@ | |||||||
| pkgincludedir = $(includedir)/qse/dhcp | pkgincludedir = $(includedir)/qse/dhcp | ||||||
|  |  | ||||||
| pkginclude_HEADERS = \ | pkginclude_HEADERS = \ | ||||||
| 	dhcpmsg.h  | 	dhcpmsg.h \ | ||||||
|  | 	dhcp4msg.h \ | ||||||
|  | 	dhcp6msg.h  | ||||||
|  |  | ||||||
|  | |||||||
| @ -340,7 +340,9 @@ top_build_prefix = @top_build_prefix@ | |||||||
| top_builddir = @top_builddir@ | top_builddir = @top_builddir@ | ||||||
| top_srcdir = @top_srcdir@ | top_srcdir = @top_srcdir@ | ||||||
| pkginclude_HEADERS = \ | pkginclude_HEADERS = \ | ||||||
| 	dhcpmsg.h  | 	dhcpmsg.h \ | ||||||
|  | 	dhcp4msg.h \ | ||||||
|  | 	dhcp6msg.h  | ||||||
|  |  | ||||||
| all: all-am | all: all-am | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										217
									
								
								qse/include/qse/dhcp/dhcp4msg.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								qse/include/qse/dhcp/dhcp4msg.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,217 @@ | |||||||
|  | #ifndef _QSE_DHCP_DHCP4MSG_H_ | ||||||
|  | #define _QSE_DHCP_DHCP4MSG_H_ | ||||||
|  |  | ||||||
|  | #include <qse/types.h> | ||||||
|  | #include <qse/macros.h> | ||||||
|  |  | ||||||
|  | #define QSE_DHCP4_SERVER_PORT   67 | ||||||
|  | #define QSE_DHCP4_CLIENT_PORT   68 | ||||||
|  | #define QSE_DHCP4_MAGIC_COOKIE  0x63825363 | ||||||
|  |  | ||||||
|  | /* operation code */ | ||||||
|  | enum qse_dhcp4_op_t | ||||||
|  | { | ||||||
|  | 	QSE_DHCP4_OP_BOOTREQUEST = 1, | ||||||
|  | 	QSE_DHCP4_OP_BOOTREPLY   = 2 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | enum qse_dhcp4_htype_t | ||||||
|  | { | ||||||
|  | 	QSE_DHCP4_HTYPE_ETHERNET   = 1, | ||||||
|  | 	QSE_DHCP4_HTYPE_IEEE802    = 6, | ||||||
|  | 	QSE_DHCP4_HTYPE_ARCNET     = 7, | ||||||
|  | 	QSE_DHCP4_HTYPE_APPLETALK  = 8, | ||||||
|  | 	QSE_DHCP4_HTYPE_HDLC       = 17, | ||||||
|  | 	QSE_DHCP4_HTYPE_ATM        = 19, | ||||||
|  | 	QSE_DHCP4_HTYPE_INFINIBAND = 32 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* option codes (partial) */ | ||||||
|  | enum qse_dhcp4_opt_t | ||||||
|  | { | ||||||
|  | 	QSE_DHCP4_OPT_PADDING          = 0x00, | ||||||
|  | 	QSE_DHCP4_OPT_SUBNET           = 0x01, | ||||||
|  | 	QSE_DHCP4_OPT_TIME_OFFSET      = 0x02, | ||||||
|  | 	QSE_DHCP4_OPT_ROUTER           = 0x03, | ||||||
|  | 	QSE_DHCP4_OPT_TIME_SERVER      = 0x04, | ||||||
|  | 	QSE_DHCP4_OPT_NAME_SERVER      = 0x05, | ||||||
|  | 	QSE_DHCP4_OPT_DNS_SERVER       = 0x06, | ||||||
|  | 	QSE_DHCP4_OPT_LOG_SERVER       = 0x07, | ||||||
|  | 	QSE_DHCP4_OPT_COOKIE_SERVER    = 0x08, | ||||||
|  | 	QSE_DHCP4_OPT_LPR_SERVER       = 0x09, | ||||||
|  | 	QSE_DHCP4_OPT_HOST_NAME        = 0x0c, | ||||||
|  | 	QSE_DHCP4_OPT_BOOT_SIZE        = 0x0d, | ||||||
|  | 	QSE_DHCP4_OPT_DOMAIN_NAME      = 0x0f, | ||||||
|  | 	QSE_DHCP4_OPT_SWAP_SERVER      = 0x10, | ||||||
|  | 	QSE_DHCP4_OPT_ROOT_PATH        = 0x11, | ||||||
|  | 	QSE_DHCP4_OPT_IP_TTL           = 0x17, | ||||||
|  | 	QSE_DHCP4_OPT_MTU              = 0x1a, | ||||||
|  | 	QSE_DHCP4_OPT_BROADCAST        = 0x1c, | ||||||
|  | 	QSE_DHCP4_OPT_NTP_SERVER       = 0x2a, | ||||||
|  | 	QSE_DHCP4_OPT_WINS_SERVER      = 0x2c, | ||||||
|  | 	QSE_DHCP4_OPT_REQUESTED_IPADDR = 0x32, | ||||||
|  | 	QSE_DHCP4_OPT_LEASE_TIME       = 0x33, | ||||||
|  | 	QSE_DHCP4_OPT_OVERLOAD         = 0x34, /* overload sname or file */ | ||||||
|  | 	QSE_DHCP4_OPT_MESSAGE_TYPE     = 0x35, | ||||||
|  | 	QSE_DHCP4_OPT_SERVER_ID        = 0x36, | ||||||
|  | 	QSE_DHCP4_OPT_PARAM_REQ        = 0x37, | ||||||
|  | 	QSE_DHCP4_OPT_MESSAGE          = 0x38, | ||||||
|  | 	QSE_DHCP4_OPT_MAX_SIZE         = 0x39, | ||||||
|  | 	QSE_DHCP4_OPT_T1               = 0x3a, | ||||||
|  | 	QSE_DHCP4_OPT_T2               = 0x3b, | ||||||
|  | 	QSE_DHCP4_OPT_VENDOR           = 0x3c, | ||||||
|  | 	QSE_DHCP4_OPT_CLIENT_ID        = 0x3d, | ||||||
|  | 	QSE_DHCP4_OPT_RELAY            = 0x52, | ||||||
|  | 	QSE_DHCP4_OPT_SUBNET_SELECTION = 0x76, | ||||||
|  | 	QSE_DHCP4_OPT_END              = 0xFF | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* flags for QSE_DHCP4_OPT_OVERLOAD */ | ||||||
|  | enum qse_dhcp4_opt_overload_t | ||||||
|  | { | ||||||
|  | 	QSE_DHCP4_OPT_OVERLOAD_FILE  = (1 << 0), | ||||||
|  | 	QSE_DHCP4_OPT_OVERLOAD_SNAME = (1 << 1) | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* flags for QSE_DHCP4_OPT_OVERLOAD */ | ||||||
|  | enum qse_dhcp4_opt_relay_t | ||||||
|  | { | ||||||
|  | 	QSE_DHCP4_OPT_RELAY_CIRCUIT_ID  = 1, | ||||||
|  | 	QSE_DHCP4_OPT_RELAY_REMOTE_ID   = 2 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* message type */ | ||||||
|  | enum qse_dhcp4_msg_t | ||||||
|  | { | ||||||
|  | 	QSE_DHCP4_MSG_DISCOVER         = 1, | ||||||
|  | 	QSE_DHCP4_MSG_OFFER            = 2, | ||||||
|  | 	QSE_DHCP4_MSG_REQUEST          = 3, | ||||||
|  | 	QSE_DHCP4_MSG_DECLINE          = 4, | ||||||
|  | 	QSE_DHCP4_MSG_ACK              = 5, | ||||||
|  | 	QSE_DHCP4_MSG_NAK              = 6, | ||||||
|  | 	QSE_DHCP4_MSG_RELEASE          = 7, | ||||||
|  | 	QSE_DHCP4_MSG_INFORM           = 8, | ||||||
|  |  | ||||||
|  | 	/*QSE_DHCP4_MSG_RENEW            = 9,*/ | ||||||
|  |  | ||||||
|  | 	QSE_DHCP4_MSG_LEASE_QUERY      = 10, | ||||||
|  | 	QSE_DHCP4_MSG_LEASE_UNASSIGNED = 11, | ||||||
|  | 	QSE_DHCP4_MSG_LEASE_UNKNOWN    = 12, | ||||||
|  | 	QSE_DHCP4_MSG_LEASE_ACTIVE     = 13, | ||||||
|  |  | ||||||
|  | 	QSE_DHCP4_MSG_BULK_LEASE_QUERY = 14, | ||||||
|  | 	QSE_DHCP4_MSG_LEASE_QUERY_DONE = 15 | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* --------------------------------------------------- */ | ||||||
|  | #include <qse/pack1.h> | ||||||
|  | /* --------------------------------------------------- */ | ||||||
|  |  | ||||||
|  | struct qse_dhcp4_pkt_hdr_t | ||||||
|  | { | ||||||
|  | 	qse_uint8_t  op;  | ||||||
|  | 	qse_uint8_t  htype;  | ||||||
|  | 	qse_uint8_t  hlen;  | ||||||
|  | 	qse_uint8_t  hops; | ||||||
|  | 	qse_uint32_t xid;        /* transaction id */ | ||||||
|  | 	qse_uint16_t secs;       /* seconds elapsed */ | ||||||
|  | 	qse_uint16_t flags;      /* bootp flags */ | ||||||
|  | 	qse_uint32_t ciaddr;     /* client ip */ | ||||||
|  | 	qse_uint32_t yiaddr;     /* your ip */ | ||||||
|  | 	qse_uint32_t siaddr;     /* next server ip */ | ||||||
|  | 	qse_uint32_t giaddr;     /* relay agent ip */ | ||||||
|  | 	qse_uint8_t  chaddr[16]; /* client mac */ | ||||||
|  |  | ||||||
|  | 	char     sname[64];      /* server host name */ | ||||||
|  | 	char     file[128];      /* boot file name */ | ||||||
|  |  | ||||||
|  | 	/* options are placed after the header. | ||||||
|  | 	 * the first four bytes of the options compose a magic cookie   | ||||||
|  | 	 * 0x63 0x82 0x53 0x63 */ | ||||||
|  | }; | ||||||
|  | typedef struct qse_dhcp4_pkt_hdr_t qse_dhcp4_pkt_hdr_t; | ||||||
|  |  | ||||||
|  | struct qse_dhcp4_opt_hdr_t | ||||||
|  | { | ||||||
|  | 	qse_uint8_t code; | ||||||
|  | 	qse_uint8_t len; | ||||||
|  | }; | ||||||
|  | typedef struct qse_dhcp4_opt_hdr_t qse_dhcp4_opt_hdr_t; | ||||||
|  |  | ||||||
|  | /* --------------------------------------------------- */ | ||||||
|  | #include <qse/unpack.h> | ||||||
|  | /* --------------------------------------------------- */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | typedef int (*qse_dhcp4_opt_walker_t) (qse_dhcp4_opt_hdr_t* opt); | ||||||
|  |  | ||||||
|  | struct qse_dhcp4_pktinf_t | ||||||
|  | { | ||||||
|  | 	qse_dhcp4_pkt_hdr_t* hdr; | ||||||
|  | 	qse_size_t           len; | ||||||
|  | }; | ||||||
|  | typedef struct qse_dhcp4_pktinf_t qse_dhcp4_pktinf_t; | ||||||
|  |  | ||||||
|  | struct qse_dhcp4_pktbuf_t | ||||||
|  | { | ||||||
|  | 	qse_dhcp4_pkt_hdr_t* hdr; | ||||||
|  | 	qse_size_t           len; | ||||||
|  | 	qse_size_t           capa; | ||||||
|  | }; | ||||||
|  | typedef struct qse_dhcp4_pktbuf_t qse_dhcp4_pktbuf_t; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | QSE_EXPORT int qse_dhcp4_initialize_pktbuf ( | ||||||
|  | 	qse_dhcp4_pktbuf_t* pkt, | ||||||
|  | 	void*               buf, | ||||||
|  | 	qse_size_t          capa | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | QSE_EXPORT int qse_dhcp4_add_option ( | ||||||
|  | 	qse_dhcp4_pktbuf_t* pkt, | ||||||
|  | 	int                 code, | ||||||
|  | 	void*               optr, /**< option data pointer */ | ||||||
|  | 	qse_uint8_t         olen  /**< option data length */ | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | QSE_EXPORT void qse_dhcp4_compact_options ( | ||||||
|  | 	qse_dhcp4_pktbuf_t* pkt | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | #if 0 | ||||||
|  | QSE_EXPORT int qse_dhcp4_add_options ( | ||||||
|  | 	qse_dhcp4_pkt_hdr_t* pkt, | ||||||
|  | 	qse_size_t       len, | ||||||
|  | 	qse_size_t       max, | ||||||
|  | 	int              code, | ||||||
|  | 	qse_uint8_t*     optr, /* option data */ | ||||||
|  | 	qse_uint8_t      olen  /* option length */ | ||||||
|  | ); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | QSE_EXPORT int qse_dhcp4_walk_options ( | ||||||
|  | 	const qse_dhcp4_pktinf_t* pkt, | ||||||
|  | 	qse_dhcp4_opt_walker_t    walker | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | QSE_EXPORT qse_dhcp4_opt_hdr_t* qse_dhcp4_find_option ( | ||||||
|  | 	const qse_dhcp4_pktinf_t* pkt, | ||||||
|  | 	int                       code | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | QSE_EXPORT qse_uint8_t* qse_dhcp4_get_relay_suboption ( | ||||||
|  | 	const qse_uint8_t* ptr,  | ||||||
|  | 	qse_uint8_t        len, | ||||||
|  | 	int                code, | ||||||
|  | 	qse_uint8_t*       olen | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | #endif | ||||||
							
								
								
									
										88
									
								
								qse/include/qse/dhcp/dhcp6msg.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								qse/include/qse/dhcp/dhcp6msg.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,88 @@ | |||||||
|  | #ifndef _QSE_DHCP_DHCP6MSG_H_ | ||||||
|  | #define _QSE_DHCP_DHCP6MSG_H_ | ||||||
|  |  | ||||||
|  | #include <qse/types.h> | ||||||
|  | #include <qse/macros.h> | ||||||
|  |  | ||||||
|  | #define QSE_DHCP6_SERVER_PORT     547 | ||||||
|  | #define QSE_DHCP6_CLIENT_PORT     546 | ||||||
|  | #define QSE_DHCP6_HOP_COUNT_LIMIT 32 | ||||||
|  |  | ||||||
|  | enum qse_dhcp6_msg_t | ||||||
|  | { | ||||||
|  | 	QSE_DHCP6_MSG_SOLICIT     = 1, | ||||||
|  | 	QSE_DHCP6_MSG_ADVERTISE   = 2, | ||||||
|  | 	QSE_DHCP6_MSG_REQUEST     = 3, | ||||||
|  | 	QSE_DHCP6_MSG_CONFIRM     = 4, | ||||||
|  | 	QSE_DHCP6_MSG_RENEW       = 5, | ||||||
|  | 	QSE_DHCP6_MSG_REBIND      = 6, | ||||||
|  | 	QSE_DHCP6_MSG_REPLY       = 7, | ||||||
|  | 	QSE_DHCP6_MSG_RELEASE     = 8, | ||||||
|  | 	QSE_DHCP6_MSG_DECLINE     = 9, | ||||||
|  | 	QSE_DHCP6_MSG_RECONFIGURE = 10, | ||||||
|  | 	QSE_DHCP6_MSG_INFOREQ     = 11, | ||||||
|  | 	QSE_DHCP6_MSG_RELAYFORW   = 12, | ||||||
|  | 	QSE_DHCP6_MSG_RELAYREPL   = 13, | ||||||
|  | }; | ||||||
|  | typedef enum qse_dhcp6_msg_t qse_dhcp6_msg_t; | ||||||
|  |  | ||||||
|  | enum qse_dhcp6_opt_t | ||||||
|  | { | ||||||
|  | 	QSE_DHCP6_OPT_RELAY_MESSAGE = 9, | ||||||
|  | 	QSE_DHCP6_OPT_INTERFACE_ID = 18 | ||||||
|  | }; | ||||||
|  | typedef enum qse_dhcp6_opt_t qse_dhcp6_opt_t; | ||||||
|  |  | ||||||
|  | /* --------------------------------------------------- */ | ||||||
|  | #include <qse/pack1.h> | ||||||
|  | /* --------------------------------------------------- */ | ||||||
|  |  | ||||||
|  | struct qse_dhcp6_pkt_hdr_t | ||||||
|  | { | ||||||
|  | 	qse_uint8_t msgtype; | ||||||
|  | 	qse_uint8_t transid[3]; | ||||||
|  | }; | ||||||
|  | typedef struct qse_dhcp6_pkt_hdr_t qse_dhcp6_pkt_hdr_t; | ||||||
|  |  | ||||||
|  | struct qse_dhcp6_relay_hdr_t | ||||||
|  | { | ||||||
|  | 	qse_uint8_t msgtype;  /* RELAY-FORW, RELAY-REPL */ | ||||||
|  | 	qse_uint8_t hopcount; | ||||||
|  | 	qse_uint8_t linkaddr[16]; | ||||||
|  | 	qse_uint8_t peeraddr[16]; | ||||||
|  | }; | ||||||
|  | typedef struct qse_dhcp6_relay_hdr_t qse_dhcp6_relay_hdr_t; | ||||||
|  |  | ||||||
|  | struct qse_dhcp6_opt_hdr_t | ||||||
|  | { | ||||||
|  | 	qse_uint16_t code; | ||||||
|  | 	qse_uint16_t len; /* length of option data, excludes the option header */ | ||||||
|  | }; | ||||||
|  | typedef struct qse_dhcp6_opt_hdr_t qse_dhcp6_opt_hdr_t; | ||||||
|  |  | ||||||
|  | /* --------------------------------------------------- */ | ||||||
|  | #include <qse/unpack.h> | ||||||
|  | /* --------------------------------------------------- */ | ||||||
|  |  | ||||||
|  | struct qse_dhcp6_pktinf_t | ||||||
|  | { | ||||||
|  | 	qse_dhcp6_pkt_hdr_t* hdr; | ||||||
|  | 	qse_size_t           len; | ||||||
|  | }; | ||||||
|  | typedef struct qse_dhcp6_pktinf_t qse_dhcp6_pktinf_t; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | extern "C" { | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | QSE_EXPORT qse_dhcp6_opt_hdr_t* qse_dhcp6_find_option ( | ||||||
|  | 	const qse_dhcp6_pktinf_t* pkt, | ||||||
|  | 	int                          code | ||||||
|  | ); | ||||||
|  |  | ||||||
|  | #ifdef __cplusplus | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #endif | ||||||
| @ -1,210 +1,7 @@ | |||||||
| #ifndef _QSE_DHCP_DHCPMSG_H_ | #ifndef _QSE_DHCP_DHCPMSG_H_ | ||||||
| #define _QSE_DHCP_DHCPMSG_H_ | #define _QSE_DHCP_DHCPMSG_H_ | ||||||
|  |  | ||||||
| #include <qse/types.h> | #include <qse/dhcp/dhcp4msg.h> | ||||||
| #include <qse/macros.h> | #include <qse/dhcp/dhcp6msg.h> | ||||||
|  |  | ||||||
| #define QSE_DHCP4_SERVER_PORT   67 |  | ||||||
| #define QSE_DHCP4_CLIENT_PORT   68 |  | ||||||
| #define QSE_DHCP4_MAGIC_COOKIE  0x63825363 |  | ||||||
|  |  | ||||||
| /* operation code */ |  | ||||||
| enum qse_dhcp4_op_t |  | ||||||
| { |  | ||||||
| 	QSE_DHCP4_OP_BOOTREQUEST = 1, |  | ||||||
| 	QSE_DHCP4_OP_BOOTREPLY   = 2 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| enum qse_dhcp4_htype_t |  | ||||||
| { |  | ||||||
| 	QSE_DHCP4_HTYPE_ETHERNET   = 1, |  | ||||||
| 	QSE_DHCP4_HTYPE_IEEE802    = 6, |  | ||||||
| 	QSE_DHCP4_HTYPE_ARCNET     = 7, |  | ||||||
| 	QSE_DHCP4_HTYPE_APPLETALK  = 8, |  | ||||||
| 	QSE_DHCP4_HTYPE_HDLC       = 17, |  | ||||||
| 	QSE_DHCP4_HTYPE_ATM        = 19, |  | ||||||
| 	QSE_DHCP4_HTYPE_INFINIBAND = 32 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /* option codes (partial) */ |  | ||||||
| enum qse_dhcp4_opt_t |  | ||||||
| { |  | ||||||
| 	QSE_DHCP4_OPT_PADDING          = 0x00, |  | ||||||
| 	QSE_DHCP4_OPT_SUBNET           = 0x01, |  | ||||||
| 	QSE_DHCP4_OPT_TIME_OFFSET      = 0x02, |  | ||||||
| 	QSE_DHCP4_OPT_ROUTER           = 0x03, |  | ||||||
| 	QSE_DHCP4_OPT_TIME_SERVER      = 0x04, |  | ||||||
| 	QSE_DHCP4_OPT_NAME_SERVER      = 0x05, |  | ||||||
| 	QSE_DHCP4_OPT_DNS_SERVER       = 0x06, |  | ||||||
| 	QSE_DHCP4_OPT_LOG_SERVER       = 0x07, |  | ||||||
| 	QSE_DHCP4_OPT_COOKIE_SERVER    = 0x08, |  | ||||||
| 	QSE_DHCP4_OPT_LPR_SERVER       = 0x09, |  | ||||||
| 	QSE_DHCP4_OPT_HOST_NAME        = 0x0c, |  | ||||||
| 	QSE_DHCP4_OPT_BOOT_SIZE        = 0x0d, |  | ||||||
| 	QSE_DHCP4_OPT_DOMAIN_NAME      = 0x0f, |  | ||||||
| 	QSE_DHCP4_OPT_SWAP_SERVER      = 0x10, |  | ||||||
| 	QSE_DHCP4_OPT_ROOT_PATH        = 0x11, |  | ||||||
| 	QSE_DHCP4_OPT_IP_TTL           = 0x17, |  | ||||||
| 	QSE_DHCP4_OPT_MTU              = 0x1a, |  | ||||||
| 	QSE_DHCP4_OPT_BROADCAST        = 0x1c, |  | ||||||
| 	QSE_DHCP4_OPT_NTP_SERVER       = 0x2a, |  | ||||||
| 	QSE_DHCP4_OPT_WINS_SERVER      = 0x2c, |  | ||||||
| 	QSE_DHCP4_OPT_REQUESTED_IPADDR = 0x32, |  | ||||||
| 	QSE_DHCP4_OPT_LEASE_TIME       = 0x33, |  | ||||||
| 	QSE_DHCP4_OPT_OVERLOAD         = 0x34, /* overload sname or file */ |  | ||||||
| 	QSE_DHCP4_OPT_MESSAGE_TYPE     = 0x35, |  | ||||||
| 	QSE_DHCP4_OPT_SERVER_ID        = 0x36, |  | ||||||
| 	QSE_DHCP4_OPT_PARAM_REQ        = 0x37, |  | ||||||
| 	QSE_DHCP4_OPT_MESSAGE          = 0x38, |  | ||||||
| 	QSE_DHCP4_OPT_MAX_SIZE         = 0x39, |  | ||||||
| 	QSE_DHCP4_OPT_T1               = 0x3a, |  | ||||||
| 	QSE_DHCP4_OPT_T2               = 0x3b, |  | ||||||
| 	QSE_DHCP4_OPT_VENDOR           = 0x3c, |  | ||||||
| 	QSE_DHCP4_OPT_CLIENT_ID        = 0x3d, |  | ||||||
| 	QSE_DHCP4_OPT_RELAY            = 0x52, |  | ||||||
| 	QSE_DHCP4_OPT_SUBNET_SELECTION = 0x76, |  | ||||||
| 	QSE_DHCP4_OPT_END              = 0xFF |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /* flags for QSE_DHCP4_OPT_OVERLOAD */ |  | ||||||
| enum qse_dhcp4_opt_overload_t |  | ||||||
| { |  | ||||||
| 	QSE_DHCP4_OPT_OVERLOAD_FILE  = (1 << 0), |  | ||||||
| 	QSE_DHCP4_OPT_OVERLOAD_SNAME = (1 << 1) |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /* flags for QSE_DHCP4_OPT_OVERLOAD */ |  | ||||||
| enum qse_dhcp4_opt_relay_t |  | ||||||
| { |  | ||||||
| 	QSE_DHCP4_OPT_RELAY_CIRCUIT_ID  = 1, |  | ||||||
| 	QSE_DHCP4_OPT_RELAY_REMOTE_ID   = 2 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /* message type */ |  | ||||||
| enum qse_dhcp4_msg_t |  | ||||||
| { |  | ||||||
| 	QSE_DHCP4_MSG_DISCOVER         = 1, |  | ||||||
| 	QSE_DHCP4_MSG_OFFER            = 2, |  | ||||||
| 	QSE_DHCP4_MSG_REQUEST          = 3, |  | ||||||
| 	QSE_DHCP4_MSG_DECLINE          = 4, |  | ||||||
| 	QSE_DHCP4_MSG_ACK              = 5, |  | ||||||
| 	QSE_DHCP4_MSG_NAK              = 6, |  | ||||||
| 	QSE_DHCP4_MSG_RELEASE          = 7, |  | ||||||
| 	QSE_DHCP4_MSG_INFORM           = 8, |  | ||||||
|  |  | ||||||
| 	/*QSE_DHCP4_MSG_RENEW            = 9,*/ |  | ||||||
|  |  | ||||||
| 	QSE_DHCP4_MSG_LEASE_QUERY      = 10, |  | ||||||
| 	QSE_DHCP4_MSG_LEASE_UNASSIGNED = 11, |  | ||||||
| 	QSE_DHCP4_MSG_LEASE_UNKNOWN    = 12, |  | ||||||
| 	QSE_DHCP4_MSG_LEASE_ACTIVE     = 13, |  | ||||||
|  |  | ||||||
| 	QSE_DHCP4_MSG_BULK_LEASE_QUERY = 14, |  | ||||||
| 	QSE_DHCP4_MSG_LEASE_QUERY_DONE = 15 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #include <qse/pack1.h> |  | ||||||
|  |  | ||||||
| struct qse_dhcp4_pkt_hdr_t |  | ||||||
| { |  | ||||||
| 	qse_uint8_t  op;  |  | ||||||
| 	qse_uint8_t  htype;  |  | ||||||
| 	qse_uint8_t  hlen;  |  | ||||||
| 	qse_uint8_t  hops; |  | ||||||
| 	qse_uint32_t xid;        /* transaction id */ |  | ||||||
| 	qse_uint16_t secs;       /* seconds elapsed */ |  | ||||||
| 	qse_uint16_t flags;      /* bootp flags */ |  | ||||||
| 	qse_uint32_t ciaddr;     /* client ip */ |  | ||||||
| 	qse_uint32_t yiaddr;     /* your ip */ |  | ||||||
| 	qse_uint32_t siaddr;     /* next server ip */ |  | ||||||
| 	qse_uint32_t giaddr;     /* relay agent ip */ |  | ||||||
| 	qse_uint8_t  chaddr[16]; /* client mac */ |  | ||||||
|  |  | ||||||
| 	char     sname[64];      /* server host name */ |  | ||||||
| 	char     file[128];      /* boot file name */ |  | ||||||
|  |  | ||||||
| 	/* options are placed after the header. |  | ||||||
| 	 * the first four bytes of the options compose a magic cookie   |  | ||||||
| 	 * 0x63 0x82 0x53 0x63 */ |  | ||||||
| }; |  | ||||||
| typedef struct qse_dhcp4_pkt_hdr_t qse_dhcp4_pkt_hdr_t; |  | ||||||
|  |  | ||||||
| struct qse_dhcp4_opt_hdr_t |  | ||||||
| { |  | ||||||
| 	qse_uint8_t code; |  | ||||||
| 	qse_uint8_t len; |  | ||||||
| }; |  | ||||||
| typedef struct qse_dhcp4_opt_hdr_t qse_dhcp4_opt_hdr_t; |  | ||||||
|  |  | ||||||
| typedef int (*qse_dhcp4_opt_walker_t) (qse_dhcp4_opt_hdr_t* opt); |  | ||||||
|  |  | ||||||
| struct qse_dhcp4_pktinf_t |  | ||||||
| { |  | ||||||
| 	qse_dhcp4_pkt_hdr_t* hdr; |  | ||||||
| 	qse_size_t           len; |  | ||||||
| }; |  | ||||||
| typedef struct qse_dhcp4_pktinf_t qse_dhcp4_pktinf_t; |  | ||||||
|  |  | ||||||
| struct qse_dhcp4_pktbuf_t |  | ||||||
| { |  | ||||||
| 	qse_dhcp4_pkt_hdr_t* hdr; |  | ||||||
| 	qse_size_t           len; |  | ||||||
| 	qse_size_t           capa; |  | ||||||
| }; |  | ||||||
| typedef struct qse_dhcp4_pktbuf_t qse_dhcp4_pktbuf_t; |  | ||||||
|  |  | ||||||
| #include <qse/unpack.h> |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| extern "C" { |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| QSE_EXPORT int qse_dhcp4_initialize_pktbuf ( |  | ||||||
| 	qse_dhcp4_pktbuf_t* pkt, |  | ||||||
| 	void*               buf, |  | ||||||
| 	qse_size_t          capa |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| QSE_EXPORT int qse_dhcp4_add_option ( |  | ||||||
| 	qse_dhcp4_pktbuf_t* pkt, |  | ||||||
| 	int                 code, |  | ||||||
| 	void*               optr, /**< option data pointer */ |  | ||||||
| 	qse_uint8_t         olen  /**< option data length */ |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| QSE_EXPORT void qse_dhcp4_compact_options ( |  | ||||||
| 	qse_dhcp4_pktbuf_t* pkt |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| #if 0 |  | ||||||
| QSE_EXPORT int qse_dhcp4_add_options ( |  | ||||||
| 	qse_dhcp4_pkt_hdr_t* pkt, |  | ||||||
| 	qse_size_t       len, |  | ||||||
| 	qse_size_t       max, |  | ||||||
| 	int              code, |  | ||||||
| 	qse_uint8_t*     optr, /* option data */ |  | ||||||
| 	qse_uint8_t      olen  /* option length */ |  | ||||||
| ); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| QSE_EXPORT int qse_dhcp4_walk_options ( |  | ||||||
| 	const qse_dhcp4_pktinf_t* pkt, |  | ||||||
| 	qse_dhcp4_opt_walker_t    walker |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| QSE_EXPORT qse_dhcp4_opt_hdr_t* qse_dhcp4_find_option ( |  | ||||||
| 	const qse_dhcp4_pktinf_t* pkt, |  | ||||||
| 	int                       code |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| QSE_EXPORT qse_uint8_t* qse_dhcp4_get_relay_suboption ( |  | ||||||
| 	const qse_uint8_t* ptr,  |  | ||||||
| 	qse_uint8_t        len, |  | ||||||
| 	int                code, |  | ||||||
| 	qse_uint8_t*       olen |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| #ifdef __cplusplus |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ AM_CPPFLAGS = \ | |||||||
|  |  | ||||||
| lib_LTLIBRARIES = libqsedhcp.la | lib_LTLIBRARIES = libqsedhcp.la | ||||||
| libqsedhcp_la_SOURCES =  \ | libqsedhcp_la_SOURCES =  \ | ||||||
| 	dhcpmsg.c | 	dhcp4msg.c dhcp6msg.c | ||||||
|  |  | ||||||
| libqsedhcp_la_CFLAGS =  | libqsedhcp_la_CFLAGS =  | ||||||
| libqsedhcp_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined | libqsedhcp_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined | ||||||
|  | |||||||
| @ -134,7 +134,8 @@ am__uninstall_files_from_dir = { \ | |||||||
| am__installdirs = "$(DESTDIR)$(libdir)" | am__installdirs = "$(DESTDIR)$(libdir)" | ||||||
| LTLIBRARIES = $(lib_LTLIBRARIES) | LTLIBRARIES = $(lib_LTLIBRARIES) | ||||||
| libqsedhcp_la_DEPENDENCIES = | libqsedhcp_la_DEPENDENCIES = | ||||||
| am_libqsedhcp_la_OBJECTS = libqsedhcp_la-dhcpmsg.lo | am_libqsedhcp_la_OBJECTS = libqsedhcp_la-dhcp4msg.lo \ | ||||||
|  | 	libqsedhcp_la-dhcp6msg.lo | ||||||
| libqsedhcp_la_OBJECTS = $(am_libqsedhcp_la_OBJECTS) | libqsedhcp_la_OBJECTS = $(am_libqsedhcp_la_OBJECTS) | ||||||
| AM_V_lt = $(am__v_lt_@AM_V@) | AM_V_lt = $(am__v_lt_@AM_V@) | ||||||
| am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) | am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) | ||||||
| @ -379,7 +380,7 @@ AM_CPPFLAGS = \ | |||||||
| #noinst_HEADERS = | #noinst_HEADERS = | ||||||
| lib_LTLIBRARIES = libqsedhcp.la | lib_LTLIBRARIES = libqsedhcp.la | ||||||
| libqsedhcp_la_SOURCES = \ | libqsedhcp_la_SOURCES = \ | ||||||
| 	dhcpmsg.c | 	dhcp4msg.c dhcp6msg.c | ||||||
|  |  | ||||||
| libqsedhcp_la_CFLAGS =  | libqsedhcp_la_CFLAGS =  | ||||||
| libqsedhcp_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined | libqsedhcp_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined | ||||||
| @ -462,7 +463,8 @@ mostlyclean-compile: | |||||||
| distclean-compile: | distclean-compile: | ||||||
| 	-rm -f *.tab.c | 	-rm -f *.tab.c | ||||||
|  |  | ||||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqsedhcp_la-dhcpmsg.Plo@am__quote@ | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqsedhcp_la-dhcp4msg.Plo@am__quote@ | ||||||
|  | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqsedhcp_la-dhcp6msg.Plo@am__quote@ | ||||||
|  |  | ||||||
| .c.o: | .c.o: | ||||||
| @am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< | @am__fastdepCC_TRUE@	$(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< | ||||||
| @ -485,12 +487,19 @@ distclean-compile: | |||||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||||
| @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< | @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< | ||||||
|  |  | ||||||
| libqsedhcp_la-dhcpmsg.lo: dhcpmsg.c | libqsedhcp_la-dhcp4msg.lo: dhcp4msg.c | ||||||
| @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqsedhcp_la_CFLAGS) $(CFLAGS) -MT libqsedhcp_la-dhcpmsg.lo -MD -MP -MF $(DEPDIR)/libqsedhcp_la-dhcpmsg.Tpo -c -o libqsedhcp_la-dhcpmsg.lo `test -f 'dhcpmsg.c' || echo '$(srcdir)/'`dhcpmsg.c | @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqsedhcp_la_CFLAGS) $(CFLAGS) -MT libqsedhcp_la-dhcp4msg.lo -MD -MP -MF $(DEPDIR)/libqsedhcp_la-dhcp4msg.Tpo -c -o libqsedhcp_la-dhcp4msg.lo `test -f 'dhcp4msg.c' || echo '$(srcdir)/'`dhcp4msg.c | ||||||
| @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libqsedhcp_la-dhcpmsg.Tpo $(DEPDIR)/libqsedhcp_la-dhcpmsg.Plo | @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libqsedhcp_la-dhcp4msg.Tpo $(DEPDIR)/libqsedhcp_la-dhcp4msg.Plo | ||||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dhcpmsg.c' object='libqsedhcp_la-dhcpmsg.lo' libtool=yes @AMDEPBACKSLASH@ | @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dhcp4msg.c' object='libqsedhcp_la-dhcp4msg.lo' libtool=yes @AMDEPBACKSLASH@ | ||||||
| @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||||
| @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqsedhcp_la_CFLAGS) $(CFLAGS) -c -o libqsedhcp_la-dhcpmsg.lo `test -f 'dhcpmsg.c' || echo '$(srcdir)/'`dhcpmsg.c | @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqsedhcp_la_CFLAGS) $(CFLAGS) -c -o libqsedhcp_la-dhcp4msg.lo `test -f 'dhcp4msg.c' || echo '$(srcdir)/'`dhcp4msg.c | ||||||
|  |  | ||||||
|  | libqsedhcp_la-dhcp6msg.lo: dhcp6msg.c | ||||||
|  | @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqsedhcp_la_CFLAGS) $(CFLAGS) -MT libqsedhcp_la-dhcp6msg.lo -MD -MP -MF $(DEPDIR)/libqsedhcp_la-dhcp6msg.Tpo -c -o libqsedhcp_la-dhcp6msg.lo `test -f 'dhcp6msg.c' || echo '$(srcdir)/'`dhcp6msg.c | ||||||
|  | @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libqsedhcp_la-dhcp6msg.Tpo $(DEPDIR)/libqsedhcp_la-dhcp6msg.Plo | ||||||
|  | @AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='dhcp6msg.c' object='libqsedhcp_la-dhcp6msg.lo' libtool=yes @AMDEPBACKSLASH@ | ||||||
|  | @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||||
|  | @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqsedhcp_la_CFLAGS) $(CFLAGS) -c -o libqsedhcp_la-dhcp6msg.lo `test -f 'dhcp6msg.c' || echo '$(srcdir)/'`dhcp6msg.c | ||||||
|  |  | ||||||
| mostlyclean-libtool: | mostlyclean-libtool: | ||||||
| 	-rm -f *.lo | 	-rm -f *.lo | ||||||
|  | |||||||
							
								
								
									
										31
									
								
								qse/lib/dhcp/dhcp6msg.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								qse/lib/dhcp/dhcp6msg.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | #include <qse/dhcp/dhcp6msg.h> | ||||||
|  | #include <qse/cmn/hton.h> | ||||||
|  |  | ||||||
|  | qse_dhcp6_opt_hdr_t* qse_dhcp6_find_option (const qse_dhcp6_pktinf_t* pkt, int code) | ||||||
|  | { | ||||||
|  | 	qse_dhcp6_opt_hdr_t* opt; | ||||||
|  | 	qse_size_t rem; | ||||||
|  |  | ||||||
|  | 	if (pkt->len < QSE_SIZEOF(qse_dhcp6_pkt_hdr_t)) return QSE_NULL; | ||||||
|  |  | ||||||
|  | 	if (pkt->hdr->msgtype == QSE_DHCP6_MSG_RELAYFORW || pkt->hdr->msgtype == QSE_DHCP6_MSG_RELAYREPL) | ||||||
|  | 	{ | ||||||
|  | 		if (pkt->len < QSE_SIZEOF(qse_dhcp6_relay_hdr_t)) return QSE_NULL; | ||||||
|  |  | ||||||
|  | 		rem = pkt->len - QSE_SIZEOF(qse_dhcp6_relay_hdr_t); | ||||||
|  | 		opt = (qse_dhcp6_opt_hdr_t*)(((qse_dhcp6_relay_hdr_t*)pkt->hdr) + 1); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		rem = pkt->len - QSE_SIZEOF(qse_dhcp6_pkt_hdr_t); | ||||||
|  | 		opt = (qse_dhcp6_opt_hdr_t*)(pkt->hdr + 1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	while (rem >= QSE_SIZEOF(qse_dhcp6_opt_hdr_t)) | ||||||
|  | 	{ | ||||||
|  | 		if (qse_ntoh16(opt->code) == code) return opt; | ||||||
|  | 		rem -= QSE_SIZEOF(qse_dhcp6_opt_hdr_t) + qse_ntoh16(opt->len); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return QSE_NULL; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user