make DHCP debug messages consistent
[strongswan.git] / src / libcharon / plugins / dhcp / dhcp_socket.c
index b789e11..f5bfe2a 100644 (file)
@@ -377,7 +377,7 @@ METHOD(dhcp_socket_t, enroll, dhcp_transaction_t*,
        {       /* no OFFER received */
                this->mutex->unlock(this->mutex);
                transaction->destroy(transaction);
-               DBG1(DBG_CFG, "DHCP disover timed out");
+               DBG1(DBG_CFG, "DHCP DISCOVER timed out");
                return NULL;
        }
 
@@ -395,7 +395,7 @@ METHOD(dhcp_socket_t, enroll, dhcp_transaction_t*,
        {       /* no ACK received */
                this->mutex->unlock(this->mutex);
                transaction->destroy(transaction);
-               DBG1(DBG_CFG, "DHCP request timed out");
+               DBG1(DBG_CFG, "DHCP REQUEST timed out");
                return NULL;
        }
        this->mutex->unlock(this->mutex);
@@ -446,7 +446,7 @@ METHOD(dhcp_socket_t, release, void,
  */
 static void handle_offer(private_dhcp_socket_t *this, dhcp_t *dhcp, int optlen)
 {
-       dhcp_transaction_t *transaction;
+       dhcp_transaction_t *transaction = NULL;
        enumerator_t *enumerator;
        host_t *offer, *server;
 
@@ -454,7 +454,6 @@ static void handle_offer(private_dhcp_socket_t *this, dhcp_t *dhcp, int optlen)
                                        chunk_from_thing(dhcp->your_address), 0);
        server = host_create_from_chunk(AF_INET,
                                        chunk_from_thing(dhcp->server_address), DHCP_SERVER_PORT);
-       DBG1(DBG_CFG, "received DHCP OFFER %H from %H", offer, server);
 
        this->mutex->lock(this->mutex);
        enumerator = this->discover->create_enumerator(this->discover);
@@ -462,6 +461,7 @@ static void handle_offer(private_dhcp_socket_t *this, dhcp_t *dhcp, int optlen)
        {
                if (transaction->get_id(transaction) == dhcp->transaction_id)
                {
+                       DBG1(DBG_CFG, "received DHCP OFFER %H from %H", offer, server);
                        this->discover->remove_at(this->discover, enumerator);
                        this->request->insert_last(this->request, transaction);
                        transaction->set_address(transaction, offer->clone(offer));
@@ -470,6 +470,34 @@ static void handle_offer(private_dhcp_socket_t *this, dhcp_t *dhcp, int optlen)
                }
        }
        enumerator->destroy(enumerator);
+
+       if (transaction)
+       {
+               int optsize, optpos = 0, pos;
+               dhcp_option_t *option;
+
+               while (optlen > sizeof(dhcp_option_t))
+               {
+                       option = (dhcp_option_t*)&dhcp->options[optpos];
+                       optsize = sizeof(dhcp_option_t) + option->len;
+                       if (option->type == DHCP_OPTEND || optlen < optsize)
+                       {
+                               break;
+                       }
+                       if (option->type == DHCP_DNS_SERVER ||
+                               option->type == DHCP_NBNS_SERVER)
+                       {
+                               for (pos = 0; pos + 4 <= option->len; pos += 4)
+                               {
+                                       transaction->add_attribute(transaction, option->type ==
+                                               DHCP_DNS_SERVER ? INTERNAL_IP4_DNS : INTERNAL_IP4_NBNS,
+                                               chunk_create((char*)&option->data[pos], 4));
+                               }
+                       }
+                       optlen -= optsize;
+                       optpos += optsize;
+               }
+       }
        this->mutex->unlock(this->mutex);
        this->condvar->broadcast(this->condvar);
        offer->destroy(offer);
@@ -487,7 +515,6 @@ static void handle_ack(private_dhcp_socket_t *this, dhcp_t *dhcp, int optlen)
 
        offer = host_create_from_chunk(AF_INET,
                                                chunk_from_thing(dhcp->your_address), 0);
-       DBG1(DBG_CFG, "received DHCP ACK for %H", offer);
 
        this->mutex->lock(this->mutex);
        enumerator = this->request->create_enumerator(this->request);
@@ -495,6 +522,7 @@ static void handle_ack(private_dhcp_socket_t *this, dhcp_t *dhcp, int optlen)
        {
                if (transaction->get_id(transaction) == dhcp->transaction_id)
                {
+                       DBG1(DBG_CFG, "received DHCP ACK for %H", offer);
                        this->request->remove_at(this->request, enumerator);
                        this->completed->insert_last(this->completed, transaction);
                        break;
@@ -604,13 +632,15 @@ dhcp_socket_t *dhcp_socket_create()
        struct sock_filter dhcp_filter_code[] = {
                BPF_STMT(BPF_LD+BPF_B+BPF_ABS,
                                 offsetof(struct iphdr, protocol)),
-               BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, IPPROTO_UDP, 0, 14),
+               BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, IPPROTO_UDP, 0, 16),
                BPF_STMT(BPF_LD+BPF_H+BPF_ABS, sizeof(struct iphdr) +
                                 offsetof(struct udphdr, source)),
-               BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, DHCP_SERVER_PORT, 0, 12),
+               BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, DHCP_SERVER_PORT, 0, 14),
                BPF_STMT(BPF_LD+BPF_H+BPF_ABS, sizeof(struct iphdr) +
                                 offsetof(struct udphdr, dest)),
-               BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, DHCP_CLIENT_PORT, 0, 10),
+               BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, DHCP_CLIENT_PORT, 0, 2),
+               BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, DHCP_SERVER_PORT, 0, 1),
+               BPF_JUMP(BPF_JMP+BPF_JA, 0, 0, 10),
                BPF_STMT(BPF_LD+BPF_B+BPF_ABS, sizeof(struct iphdr) +
                                 sizeof(struct udphdr) + offsetof(dhcp_t, opcode)),
                BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, BOOTREPLY, 0, 8),