From e936bf350239d1daff02b65a4228faee1b424943 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Tue, 16 Oct 2018 15:59:24 +0000 Subject: [PATCH] added qse_ip6adxx_t with address classification functions defined data types and routines and dhcpv6 messages --- qse/Makefile.in | 2 +- qse/include/qse/cmn/ipad.h | 156 +++++++++++++++++- qse/include/qse/dhcp/Makefile.am | 4 +- qse/include/qse/dhcp/Makefile.in | 4 +- qse/include/qse/dhcp/dhcp4msg.h | 217 +++++++++++++++++++++++++ qse/include/qse/dhcp/dhcp6msg.h | 88 ++++++++++ qse/include/qse/dhcp/dhcpmsg.h | 207 +---------------------- qse/lib/dhcp/Makefile.am | 2 +- qse/lib/dhcp/Makefile.in | 25 ++- qse/lib/dhcp/{dhcpmsg.c => dhcp4msg.c} | 0 qse/lib/dhcp/dhcp6msg.c | 31 ++++ 11 files changed, 514 insertions(+), 222 deletions(-) create mode 100644 qse/include/qse/dhcp/dhcp4msg.h create mode 100644 qse/include/qse/dhcp/dhcp6msg.h rename qse/lib/dhcp/{dhcpmsg.c => dhcp4msg.c} (100%) create mode 100644 qse/lib/dhcp/dhcp6msg.c diff --git a/qse/Makefile.in b/qse/Makefile.in index f3b24470..1620eea9 100644 --- a/qse/Makefile.in +++ b/qse/Makefile.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/install-sh $(top_srcdir)/ac/ltmain.sh \ $(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) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) diff --git a/qse/include/qse/cmn/ipad.h b/qse/include/qse/cmn/ipad.h index 7c6e0b88..66bfc2de 100644 --- a/qse/include/qse/cmn/ipad.h +++ b/qse/include/qse/cmn/ipad.h @@ -40,6 +40,35 @@ struct qse_ip4ad_t 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) struct qse_ip4adxx_t: public qse_ip4ad_t { @@ -111,15 +140,132 @@ struct qse_ip4adxx_t: public qse_ip4ad_t 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 -struct qse_ip6ad_t -{ - qse_uint8_t value[16]; -}; #include -#define QSE_IP4AD_IN_LOOPBACK(addr) ((((addr)->value) & QSE_CONST_HTON32(0xFF000000)) == QSE_CONST_HTON32(0x7F000000)) + + #if defined(__cplusplus) extern "C" { diff --git a/qse/include/qse/dhcp/Makefile.am b/qse/include/qse/dhcp/Makefile.am index 4198abd2..0043b596 100644 --- a/qse/include/qse/dhcp/Makefile.am +++ b/qse/include/qse/dhcp/Makefile.am @@ -1,5 +1,7 @@ pkgincludedir = $(includedir)/qse/dhcp pkginclude_HEADERS = \ - dhcpmsg.h + dhcpmsg.h \ + dhcp4msg.h \ + dhcp6msg.h diff --git a/qse/include/qse/dhcp/Makefile.in b/qse/include/qse/dhcp/Makefile.in index ae28f382..f56e7aee 100644 --- a/qse/include/qse/dhcp/Makefile.in +++ b/qse/include/qse/dhcp/Makefile.in @@ -340,7 +340,9 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pkginclude_HEADERS = \ - dhcpmsg.h + dhcpmsg.h \ + dhcp4msg.h \ + dhcp6msg.h all: all-am diff --git a/qse/include/qse/dhcp/dhcp4msg.h b/qse/include/qse/dhcp/dhcp4msg.h new file mode 100644 index 00000000..7db2f608 --- /dev/null +++ b/qse/include/qse/dhcp/dhcp4msg.h @@ -0,0 +1,217 @@ +#ifndef _QSE_DHCP_DHCP4MSG_H_ +#define _QSE_DHCP_DHCP4MSG_H_ + +#include +#include + +#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 +/* --------------------------------------------------- */ + +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 +/* --------------------------------------------------- */ + + + +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 diff --git a/qse/include/qse/dhcp/dhcp6msg.h b/qse/include/qse/dhcp/dhcp6msg.h new file mode 100644 index 00000000..9282481b --- /dev/null +++ b/qse/include/qse/dhcp/dhcp6msg.h @@ -0,0 +1,88 @@ +#ifndef _QSE_DHCP_DHCP6MSG_H_ +#define _QSE_DHCP_DHCP6MSG_H_ + +#include +#include + +#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 +/* --------------------------------------------------- */ + +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 +/* --------------------------------------------------- */ + +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 diff --git a/qse/include/qse/dhcp/dhcpmsg.h b/qse/include/qse/dhcp/dhcpmsg.h index ab3b3c75..79610568 100644 --- a/qse/include/qse/dhcp/dhcpmsg.h +++ b/qse/include/qse/dhcp/dhcpmsg.h @@ -1,210 +1,7 @@ #ifndef _QSE_DHCP_DHCPMSG_H_ #define _QSE_DHCP_DHCPMSG_H_ -#include -#include +#include +#include -#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 - -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 - -#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 diff --git a/qse/lib/dhcp/Makefile.am b/qse/lib/dhcp/Makefile.am index 6dc73d4c..2f47cfde 100644 --- a/qse/lib/dhcp/Makefile.am +++ b/qse/lib/dhcp/Makefile.am @@ -8,7 +8,7 @@ AM_CPPFLAGS = \ lib_LTLIBRARIES = libqsedhcp.la libqsedhcp_la_SOURCES = \ - dhcpmsg.c + dhcp4msg.c dhcp6msg.c libqsedhcp_la_CFLAGS = libqsedhcp_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined diff --git a/qse/lib/dhcp/Makefile.in b/qse/lib/dhcp/Makefile.in index f9fc8908..285a997d 100644 --- a/qse/lib/dhcp/Makefile.in +++ b/qse/lib/dhcp/Makefile.in @@ -134,7 +134,8 @@ am__uninstall_files_from_dir = { \ am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) 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) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -379,7 +380,7 @@ AM_CPPFLAGS = \ #noinst_HEADERS = lib_LTLIBRARIES = libqsedhcp.la libqsedhcp_la_SOURCES = \ - dhcpmsg.c + dhcp4msg.c dhcp6msg.c libqsedhcp_la_CFLAGS = libqsedhcp_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined @@ -462,7 +463,8 @@ mostlyclean-compile: distclean-compile: -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: @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@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< -libqsedhcp_la-dhcpmsg.lo: 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-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_at)$(am__mv) $(DEPDIR)/libqsedhcp_la-dhcpmsg.Tpo $(DEPDIR)/libqsedhcp_la-dhcpmsg.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dhcpmsg.c' object='libqsedhcp_la-dhcpmsg.lo' libtool=yes @AMDEPBACKSLASH@ +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-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-dhcp4msg.Tpo $(DEPDIR)/libqsedhcp_la-dhcp4msg.Plo +@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@ -@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: -rm -f *.lo diff --git a/qse/lib/dhcp/dhcpmsg.c b/qse/lib/dhcp/dhcp4msg.c similarity index 100% rename from qse/lib/dhcp/dhcpmsg.c rename to qse/lib/dhcp/dhcp4msg.c diff --git a/qse/lib/dhcp/dhcp6msg.c b/qse/lib/dhcp/dhcp6msg.c new file mode 100644 index 00000000..22e1ebc6 --- /dev/null +++ b/qse/lib/dhcp/dhcp6msg.c @@ -0,0 +1,31 @@ +#include +#include + +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; +}