Add DHCPv6 functionality.
[l2tpns.git] / dhcp6.h
diff --git a/dhcp6.h b/dhcp6.h
new file mode 100644 (file)
index 0000000..4b0eb19
--- /dev/null
+++ b/dhcp6.h
@@ -0,0 +1,218 @@
+/*
+ * Fernando ALVES 2014
+ * Add functionality DHCPv6 to l2tpns.
+ * GPL licenced
+ */
+
+#ifndef __DHCP6_H__
+#define __DHCP6_H__
+
+#define DHCP6_SOLICIT                 1
+#define DHCP6_ADVERTISE               2
+#define DHCP6_REQUEST                 3
+#define DHCP6_CONFIRM                 4
+#define DHCP6_RENEW                   5
+#define DHCP6_REBIND                  6
+#define DHCP6_REPLY                   7
+#define DHCP6_RELEASE                 8
+#define DHCP6_DECLINE                 9
+#define DHCP6_RECONFIGURE            10
+#define DHCP6_INFORMATION_REQUEST    11
+#define DHCP6_RELAY_FORM             12
+#define DHCP6_RELAY_REPL             13
+
+#define D6_OPT_CLIENTID         1
+#define D6_OPT_SERVERID         2
+#define D6_OPT_IA_NA            3
+#define D6_OPT_IA_TA            4
+#define D6_OPT_IAADDR           5
+#define D6_OPT_ORO              6
+#define D6_OPT_PREFERENCE       7
+#define D6_OPT_ELAPSED_TIME     8
+#define D6_OPT_RELAY_MSG        9
+#define D6_OPT_AUTH            11
+#define D6_OPT_UNICAST         12
+#define D6_OPT_STATUS_CODE     13
+#define D6_OPT_RAPID_COMMIT    14
+#define D6_OPT_USER_CLASS      15
+#define D6_OPT_VENDOR_CLASS    16
+#define D6_OPT_VENDOR_SPECIFIC 17
+#define D6_OPT_INTERFACE_ID    18
+#define D6_OPT_RECONF_MSG      19
+#define D6_OPT_RECONF_ACCEPT   20
+#define D6_OPT_DNS_SERVERS     23
+#define D6_OPT_DOMAIN_LIST     24
+#define D6_OPT_IA_PD           25
+#define D6_OPT_IAPREFIX        26
+
+#define D6_STATUS_Success          0
+#define D6_STATUS_UnspecFail       1
+#define D6_STATUS_NoAddrsAvail     2
+#define D6_STATUS_NoBinding        3
+#define D6_STATUS_NotOnLink        4
+#define D6_STATUS_UseMulticast     5
+#define D6_STATUS_NoPrefixAvail    6
+
+#define DUID_LLT 1
+#define DUID_EN  2
+#define DUID_LL  3
+
+ //~ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F 
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |         D6_OPT_IA_PD          |        Longueur d’option      |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      IAID (4 octets)                          |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      T1 (4 octets)                            |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      T2 (4 octets)                            |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      Options-IA_PD                            |
+//~ .                                                               .
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+// Prefix for IA_PD
+ //~ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F 
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |        OPTION_IAPREFIX        |         option-length         |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      preferred-lifetime                       |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                        valid-lifetime                         |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ | prefix-length |                                               |
+//~ +-+-+-+-+-+-+-+-+          IPv6 prefix                          |
+//~ |                           (16 octets)                         |
+//~ |                                                               |
+//~ |                                                               |
+//~ |                                                               |
+//~ |               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |               |                                               .
+//~ +-+-+-+-+-+-+-+-+                                               .
+//~ .                       IAprefix-options                        .
+//~ .                                                               .
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ //~ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F 
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |         D6_OPT_IA_NA          |        Longueur d’option      |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      IAID (4 octets)                          |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      T1 (4 octets)                            |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      T2 (4 octets)                            |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      Options-IA_NA                            |
+//~ .                                                               .
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+ //~ 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F 
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |         OPTION_IA_TA          |        Longueur d’option      |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      IAID (4 octets)                          |
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//~ |                      Options-IA_TA                            |
+//~ .                                                               .
+//~ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+struct dhcp6_mess_hdr
+{
+       uint32_t type:8;
+       uint32_t trans_id:24;
+} __attribute__((packed));
+
+struct dhcp6_opt_h
+{
+       uint16_t code;
+       uint16_t len;
+} __attribute__((packed));
+
+struct dhcp6_duid
+{
+       uint16_t type;
+       union {
+               struct {
+                       uint16_t htype;
+                       uint32_t time;
+                       uint8_t addr[0];
+               } __attribute__((packed)) llt;
+               struct {
+                       uint32_t enterprise;
+                       uint8_t id[0];
+               } __attribute__((packed)) en;
+               struct {
+                       uint16_t htype;
+                       uint8_t addr[0];
+               } __attribute__((packed)) ll;
+               uint8_t raw[128];
+       } u;
+} __attribute__((packed));
+
+struct dhcp6_opt_serverid
+{
+       struct dhcp6_opt_h opt_hdr;
+       struct dhcp6_duid duid;
+} __attribute__((packed));
+
+struct dhcp6_opt_clientid
+{
+       struct dhcp6_opt_h opt_hdr;
+       struct dhcp6_duid duid;
+} __attribute__((packed));
+
+struct dhcp6_opt_ia_na {
+       struct dhcp6_opt_h hdr;
+       uint32_t iaid;
+       uint32_t T1;
+       uint32_t T2;
+} __attribute__((packed));
+
+struct dhcp6_opt_ia_ta {
+       struct dhcp6_opt_h hdr;
+       uint32_t iaid;
+} __attribute__((packed));
+
+struct dhcp6_opt_ia_pd {
+       struct dhcp6_opt_h hdr;
+       uint32_t iaid;
+       uint32_t T1;
+       uint32_t T2;
+} __attribute__((packed));
+
+struct dhcp6_opt_ia_addr {
+       struct dhcp6_opt_h hdr;
+       struct in6_addr addr;
+       uint32_t pref_lifetime;
+       uint32_t valid_lifetime;
+} __attribute__((packed));
+
+struct dhcp6_opt_oro {
+       struct dhcp6_opt_h hdr;
+       uint16_t opt_demand[0];
+} __attribute__((packed));
+
+struct dhcp6_opt_status {
+       struct dhcp6_opt_h hdr;
+       uint16_t code;
+} __attribute__((packed));
+
+struct dhcp6_opt_preference {
+       struct dhcp6_opt_h hdr;
+       uint8_t pref;
+} __attribute__((packed));
+
+struct dhcp6_opt_ia_prefix {
+       struct dhcp6_opt_h hdr;
+       uint32_t pref_lifetime;
+       uint32_t valid_lifetime;
+       uint8_t prefix_len;
+       struct in6_addr prefix;
+} __attribute__((packed));
+
+// dhcp6.c
+void dhcpv6_process(uint16_t s, uint16_t t, uint8_t *p, uint16_t l);
+void dhcpv6_init(void);
+
+#endif /* __DHCP6_H__ */