diff options
Diffstat (limited to 'tinyNET/src/dhcp/tnet_dhcp_message.h')
-rw-r--r-- | tinyNET/src/dhcp/tnet_dhcp_message.h | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/tinyNET/src/dhcp/tnet_dhcp_message.h b/tinyNET/src/dhcp/tnet_dhcp_message.h new file mode 100644 index 0000000..4101e9b --- /dev/null +++ b/tinyNET/src/dhcp/tnet_dhcp_message.h @@ -0,0 +1,226 @@ +/* +* Copyright (C) 2009-2010 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ +/**@file tnet_dhcp_message.h + * @brief DHCP Message as per RFC 2131 subclause 2. + * + * @author Mamadou Diop <diopmamadou(at)doubango.org> + * + * @date Created: Sat Nov 8 16:54:58 2009 mdiop + */ + +#ifndef TNET_DHCP_MESSAGE_H +#define TNET_DHCP_MESSAGE_H + +#include "tinynet_config.h" + +#include "tnet_dhcp_option.h" +#include "tnet_hardwares.h" + +#include "tsk_buffer.h" + +TNET_BEGIN_DECLS + +struct tnet_dhcp_ctx_s; + +#define TNET_DHCP_MESSAGE_IS_REQUEST(self) ((self) && ((self)->op==dhcp_op_bootrequest)) +#define TNET_DHCP_MESSAGE_IS_REPLY(self) ((self) && ((self)->op==dhcp_op_bootreply)) + +#define TNET_DHCP_MAGIC_COOKIE 0x63825363 /**< DHCP magic cookie (99, 130, 83 and 99 in decimal).*/ + +#define TNET_DHCP_MESSAGE_MIN_SIZE 223 /* Is it rigth? */ + +/** List of all supported DHCP message (see RFC 2131). +*/ +typedef enum tnet_dhcp_message_type_e +{ + /**< DHCPDISCOVER - Client broadcast to locate available servers. + */ + dhcp_type_discover = 1, + + /**< DHCPOFFER - Server to client in response to DHCPDISCOVER with + offer of configuration parameters. + */ + dhcp_type_offer = 2, + + /**< DHCPREQUEST - Client message to servers either (a) requesting + offered parameters from one server and implicitly + declining offers from all others, (b) confirming + correctness of previously allocated address after, + e.g., system reboot, or (c) extending the lease on a + particular network address. + */ + dhcp_type_request = 3, + + /**< DHCPDECLINE - Client to server indicating network address is already + in use. + */ + dhcp_type_decline = 4, + + /**< DHCPACK - Server to client with configuration parameters, + including committed network address. + */ + dhcp_type_ack = 5, + + /**< DHCPNAK - Server to client indicating client's notion of network + address is incorrect (e.g., client has moved to new + subnet) or client's lease as expired + */ + dhcp_type_nack = 6, + + /**< DHCPRELEASE - Client to server relinquishing network address and + cancelling remaining lease. + */ + dhcp_type_release = 7, + + /**< DHCPINFORM - Client to server, asking only for local configuration + parameters; client already has externally configured + network address. + */ + dhcp_type_inform = 8, +} +tnet_dhcp_message_type_t; + +/** DHCP message OP code / message type. +*/ +typedef enum tnet_dhcp_message_op_e +{ + dhcp_op_bootrequest = 1, + dhcp_op_bootreply = 2 +} +tnet_dhcp_message_op_t; + +/** BOOTP/DHCP message as per RFC 2131 subclause 2. +*/ +typedef struct tnet_dhcp_message_s +{ + TSK_DECLARE_OBJECT; + + /**< DHCP message type. Mandatory. + */ + tnet_dhcp_message_type_t type; + /* + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | op (1) | htype (1) | hlen (1) | hops (1) | + +---------------+---------------+---------------+---------------+ + | xid (4) | + +-------------------------------+-------------------------------+ + | secs (2) | flags (2) | + +-------------------------------+-------------------------------+ + | ciaddr (4) | + +---------------------------------------------------------------+ + | yiaddr (4) | + +---------------------------------------------------------------+ + | siaddr (4) | + +---------------------------------------------------------------+ + | giaddr (4) | + +---------------------------------------------------------------+ + | | + | chaddr (16) | + | | + | | + +---------------------------------------------------------------+ + | | + | sname (64) | + +---------------------------------------------------------------+ + | | + | file (128) | + +---------------------------------------------------------------+ + | | + | options (variable) | + +---------------------------------------------------------------+ + */ + + /**< Message op code / message type (1-byte). + 1 = BOOTREQUEST, 2 = BOOTREPLY + */ + tnet_dhcp_message_op_t op; + /**< Hardware address type, see ARP section in "Assigned Numbers" RFC; e.g., '1' = 10mb ethernet. + For more information see RFC 1340. + */ + tnet_hardware_type_t htype; + /**< Hardware address length (e.g. '6' for 10mb ethernet). tsk_strlen(chaddr). + */ + uint8_t hlen; + /**< Client sets to zero, optionally used by relay agents when booting via a relay agent. + */ + uint8_t hops; + /**< Transaction ID, a random number chosen by the client, used by the client + and server to associate messages and responses between a client and a server. + */ + uint32_t xid; + /**< Filled in by client, seconds elapsed since client began address acquisition or renewal process. + */ + uint16_t secs; + /**< Flags (see figure 2) + */ + uint16_t flags; + /**< Client IP address; only filled in if client is in BOUND, RENEW or REBINDING + state and can respond to ARP requests. + */ + uint32_t ciaddr; + /**< 'your' (client) IP address. + */ + uint32_t yiaddr; + /**< IP address of next server to use in bootstrap; + returned in DHCPOFFER, DHCPACK by server. + */ + uint32_t siaddr; + /**< Relay agent IP address, used in booting via a relay agent. + */ + uint32_t giaddr; + /**< Client hardware address. + */ + uint8_t chaddr[16]; + /**< Optional server host name, null terminated string. + */ + uint8_t sname[64]; + /**<Boot file name, null terminated string; "generic" name or null in DHCPDISCOVER, + fully qualifieddirectory-path name in DHCPOFFER. + */ + uint8_t file[128]; + /**Optional parameters field. See the options documents for a list of defined options. + For more information please refer to RFC 2132, 1497 and 1533. + */ + tnet_dhcp_options_L_t *options; +} +tnet_dhcp_message_t; + +typedef tsk_list_t tnet_dhcp_messages_L_t; +typedef tnet_dhcp_message_t tnet_dhcp_request_t; /**< BOOTREQUEST message. */ +typedef tnet_dhcp_message_t tnet_dhcp_reply_t; /**< BOOTREPLY message. */ + +tsk_buffer_t* tnet_dhcp_message_serialize(const struct tnet_dhcp_ctx_s *ctx, const tnet_dhcp_message_t *self); +tnet_dhcp_message_t* tnet_dhcp_message_deserialize(const struct tnet_dhcp_ctx_s *ctx, const uint8_t *data, tsk_size_t size); +const tnet_dhcp_option_t* tnet_dhcp_message_find_option(const tnet_dhcp_message_t *self, tnet_dhcp_option_code_t code); +int tnet_dhcp_message_add_codes(tnet_dhcp_message_t *self, tnet_dhcp_option_code_t codes[], unsigned codes_count); + +TINYNET_API tnet_dhcp_message_t* tnet_dhcp_message_create(tnet_dhcp_message_op_t opcode); +TINYNET_API tnet_dhcp_request_t* tnet_dhcp_request_create(); +TINYNET_API tnet_dhcp_message_t* tnet_dhcp_reply_create(); + +TINYNET_GEXTERN const tsk_object_def_t *tnet_dhcp_message_def_t; + +TNET_END_DECLS + +#endif /* TNET_DHCP_MESSAGE_H */ |