← Back to team overview

hipl-core team mailing list archive

[Branch ~hipl-core/hipl/trunk] Rev 4928: Sanitize packet context handling (hip_packet_context)

 

Merge authors:
  Christof Mroz (christof-mroz)
------------------------------------------------------------
revno: 4928 [merge]
committer: Christof Mroz <christof.mroz@xxxxxxxxxxxxxx>
branch nick: trunk
timestamp: Mon 2010-09-13 16:01:31 +0200
message:
  Sanitize packet context handling (hip_packet_context)
  
  This elaborates on commit 4908.
  hip_packet_context's fields are statically allocated now, save for the
  message buffers which are allocated eactly once and then reused. The
  context is correctly reset after each packet now.
  
  hip_port_pair_t used to be typedef'd to struct hip_stateless_info.
  The only instance of the latter was in hip_packet_context, so it was
  purged in favor of the less-misleading struct hip_portpair_t.
modified:
  hipd/close.c
  hipd/esp_prot_light_update.c
  hipd/hip_socket.c
  hipd/hipd.c
  hipd/hiprelay.c
  hipd/input.c
  hipd/oppdb.c
  hipd/output.c
  hipd/output.h
  lib/core/message.c
  lib/core/protodefs.h
  lib/core/state.h
  lib/tool/xfrmapi.h
  modules/update/hipd/update.c


--
lp:hipl
https://code.launchpad.net/~hipl-core/hipl/trunk

Your team HIPL core team is subscribed to branch lp:hipl.
To unsubscribe from this branch go to https://code.launchpad.net/~hipl-core/hipl/trunk/+edit-subscription
=== modified file 'hipd/close.c'
--- hipd/close.c	2010-08-29 16:24:14 +0000
+++ hipd/close.c	2010-09-09 01:12:24 +0000
@@ -306,14 +306,13 @@
     int err = 0, echo_len;
     const struct hip_echo_request *request;
 
-    HIP_IFE(!(ctx->output_msg = hip_msg_alloc()), -ENOMEM);
-
     HIP_IFEL(!(request =
                  hip_get_param(ctx->input_msg, HIP_PARAM_ECHO_REQUEST_SIGN)),
              -1, "No echo request under signature.\n");
 
     echo_len = hip_get_param_contents_len(request);
 
+    hip_msg_init(ctx->output_msg);
     hip_build_network_hdr(ctx->output_msg,
                         HIP_CLOSE_ACK,
                         0,
@@ -394,9 +393,6 @@
              -1,
              "Deleting peer info failed.\n");
 out_err:
-    if (ctx->output_msg) {
-        free(ctx->output_msg);
-    }
 #ifdef CONFIG_HIP_PERFORMANCE
     HIP_DEBUG("Stop and write PERF_HANDLE_CLOSE\n");
     hip_perf_stop_benchmark( perf_set, PERF_HANDLE_CLOSE );

=== modified file 'hipd/esp_prot_light_update.c'
--- hipd/esp_prot_light_update.c	2010-08-29 16:24:14 +0000
+++ hipd/esp_prot_light_update.c	2010-09-09 01:12:24 +0000
@@ -263,8 +263,8 @@
 
         // send ACK
         esp_prot_send_light_ack(ctx->hadb_entry,
-                                ctx->dst_addr,
-                                ctx->src_addr,
+                                &ctx->dst_addr,
+                                &ctx->src_addr,
                                 spi);
     } else if (ack != NULL) {
         /********** ACK ***********/
@@ -279,8 +279,8 @@
         ctx->hadb_entry->light_update_retrans = 0;
 
         // notify sadb about next anchor
-        HIP_IFEL(hip_add_sa(ctx->dst_addr,
-                            ctx->src_addr,
+        HIP_IFEL(hip_add_sa(&ctx->dst_addr,
+                            &ctx->src_addr,
                             &(ctx->hadb_entry)->hit_our,
                             &(ctx->hadb_entry)->hit_peer,
                             ctx->hadb_entry->spi_outbound_new,

=== modified file 'hipd/hip_socket.c'
--- hipd/hip_socket.c	2010-08-29 16:24:14 +0000
+++ hipd/hip_socket.c	2010-09-09 01:12:24 +0000
@@ -250,6 +250,18 @@
     }
 }
 
+/**
+ * Run callbacks for any global socket that's flagged in the fd_set.
+ * Invoked from hipd_main's main loop.
+ *
+ * @param read_fdset fd_set loaded with global socket handles, after
+ *                   select() call.
+ * @param ctx        Initialized packet context. Will be prepared for next
+ *                   iteration upon return.
+ * @todo             select() should probably be called here rather than in
+ *                   hipd_main (passing read_fdset is superfluous)
+ * @see              hipd_main
+ */
 void hip_run_socket_handles(fd_set *read_fdset, struct hip_packet_context *ctx)
 {
     hip_ll_node_t *iter = NULL;
@@ -260,8 +272,13 @@
             socketfd = ((struct socketfd*) iter->ptr)->fd;
 
             if (FD_ISSET(socketfd, read_fdset)) {
-                ctx->error = 0;
                 ((struct socketfd*) iter->ptr)->func_ptr(ctx);
+                HIP_DEBUG("result: %d\n", ctx->error);
+
+                /* Reset for next iteration.
+                 * msg_ports has no reset-state. */
+                ctx->hadb_entry = NULL;
+                ctx->error      = 0;
             }
         }
     } else {

=== modified file 'hipd/hipd.c'
--- hipd/hipd.c	2010-09-02 18:20:43 +0000
+++ hipd/hipd.c	2010-09-09 01:12:24 +0000
@@ -293,8 +293,6 @@
     fd_set read_fdset;
     struct hip_packet_context ctx;
 
-    memset(&ctx, 0, sizeof(ctx));
-
 #ifdef CONFIG_HIP_PERFORMANCE
     HIP_DEBUG("Creating perf set\n");
     perf_set = hip_perf_create(PERF_MAX);
@@ -350,6 +348,11 @@
     HIP_INFO("hipd pid=%d starting\n", getpid());
     time(&load_time);
 
+    /* prepare the one and only hip_packet_context instance */
+    memset(&ctx, 0, sizeof(ctx));
+    HIP_IFEL(!(ctx.input_msg  = hip_msg_alloc()), ENOMEM, "Insufficient memory");
+    HIP_IFEL(!(ctx.output_msg = hip_msg_alloc()), ENOMEM, "Insufficient memory");
+
     /* Default initialization function. */
     HIP_IFEL(hipd_init(flags), 1, "hipd_init() failed!\n");
 
@@ -360,15 +363,6 @@
 
     highest_descriptor = hip_get_highest_descriptor();
 
-    /* Allocate user message. */
-    HIP_IFE(!(ctx.input_msg = hip_msg_alloc()), 1);
-    ctx.output_msg  = NULL;
-    ctx.src_addr    = malloc(sizeof(struct in6_addr));
-    ctx.dst_addr    = malloc(sizeof(struct in6_addr));
-    ctx.msg_ports   = malloc(sizeof(struct hip_stateless_info));
-    ctx.hadb_entry  = NULL;
-    ctx.error = 0;
-
     /* Enter to the select-loop */
     HIP_DEBUG_GL(HIP_DEBUG_GROUP_INIT,
                  HIP_DEBUG_LEVEL_INFORMATIVE,
@@ -435,20 +429,11 @@
     /* free allocated resources */
     hip_exit();
 
-    if (ctx.input_msg) {
+    if(ctx.input_msg) {
         free(ctx.input_msg);
     }
-
-    if (ctx.src_addr) {
-        free(ctx.src_addr);
-    }
-
-    if (ctx.dst_addr) {
-        free(ctx.dst_addr);
-    }
-
-    if (ctx.msg_ports) {
-        free(ctx.msg_ports);
+    if(ctx.output_msg) {
+        free(ctx.output_msg);
     }
 
     HIP_INFO("hipd pid=%d exiting, retval=%d\n", getpid(), err);

=== modified file 'hipd/hiprelay.c'
--- hipd/hiprelay.c	2010-08-29 16:24:14 +0000
+++ hipd/hiprelay.c	2010-09-09 01:12:24 +0000
@@ -899,12 +899,12 @@
     HIP_DEBUG("Msg type :      %s (%d)\n",
               hip_message_type_name(hip_get_msg_type(ctx->input_msg)),
               hip_get_msg_type(ctx->input_msg));
-    HIP_DEBUG_IN6ADDR("source address", ctx->src_addr);
-    HIP_DEBUG_IN6ADDR("destination address", ctx->dst_addr);
+    HIP_DEBUG_IN6ADDR("source address", &ctx->src_addr);
+    HIP_DEBUG_IN6ADDR("destination address", &ctx->dst_addr);
     HIP_DEBUG_HIT("Relay record hit", &rec->hit_r);
     HIP_DEBUG("Relay record port: %d.\n", rec->udp_port_r);
     HIP_DEBUG("source port: %u, destination port: %u\n",
-              ctx->msg_ports->src_port, ctx->msg_ports->dst_port);
+              ctx->msg_ports.src_port, ctx->msg_ports.dst_port);
 
     if (rec->type == HIP_RVSRELAY) {
         HIP_DEBUG("Relay type is RVS\n");
@@ -941,10 +941,10 @@
                       param_type);
             if (param_type == HIP_PARAM_RELAY_FROM) {
                 hip_build_param_relay_from(msg_to_be_relayed,
-                                           ctx->src_addr,
-                                           ctx->msg_ports->src_port);
+                                           &ctx->src_addr,
+                                           ctx->msg_ports.src_port);
             } else {
-                hip_build_param_from(msg_to_be_relayed, ctx->src_addr);
+                hip_build_param_from(msg_to_be_relayed, &ctx->src_addr);
             }
             hip_build_param(msg_to_be_relayed, current_param);
             from_added = 1;
@@ -959,10 +959,10 @@
                   param_type);
         if (param_type == HIP_PARAM_RELAY_FROM) {
             hip_build_param_relay_from(msg_to_be_relayed,
-                                       ctx->src_addr,
-                                       ctx->msg_ports->src_port);
+                                       &ctx->src_addr,
+                                       ctx->msg_ports.src_port);
         } else {
-            hip_build_param_from(msg_to_be_relayed, ctx->src_addr);
+            hip_build_param_from(msg_to_be_relayed, &ctx->src_addr);
         }
     }
 
@@ -1121,8 +1121,8 @@
                   ntohs(relay_to->port));
         hip_relay_forward_response(ctx->input_msg,
                                    packet_type,
-                                   ctx->src_addr,
-                                   ctx->dst_addr,
+                                   &ctx->src_addr,
+                                   &ctx->dst_addr,
                                    &relay_to->address,
                                    ntohs(relay_to->port));
         //  state = HIP_STATE_NONE;

=== modified file 'hipd/input.c'
--- hipd/input.c	2010-08-29 16:24:14 +0000
+++ hipd/input.c	2010-09-09 01:12:24 +0000
@@ -522,8 +522,8 @@
     HIP_DEBUG_HIT("HIT Sender  ", &ctx->input_msg->hits);
     HIP_DEBUG_HIT("HIT Receiver", &ctx->input_msg->hitr);
     HIP_DEBUG("source port: %u, destination port: %u\n",
-              ctx->msg_ports->src_port,
-              ctx->msg_ports->dst_port);
+              ctx->msg_ports.src_port,
+              ctx->msg_ports.dst_port);
 
     HIP_DUMP_MSG(ctx->input_msg);
 
@@ -532,9 +532,9 @@
                             &ctx->input_msg->hits) ||
          IN6_ARE_ADDR_EQUAL(&ctx->input_msg->hitr,
                             &ipv6_any_addr)) &&
-        !hip_addr_is_loopback(ctx->dst_addr) &&
-        !hip_addr_is_loopback(ctx->src_addr) &&
-        !IN6_ARE_ADDR_EQUAL(ctx->src_addr, ctx->dst_addr)) {
+        !hip_addr_is_loopback(&ctx->dst_addr) &&
+        !hip_addr_is_loopback(&ctx->src_addr) &&
+        !IN6_ARE_ADDR_EQUAL(&ctx->src_addr, &ctx->dst_addr)) {
         HIP_DEBUG("Invalid loopback packet. Dropping.\n");
         goto out_err;
     }
@@ -565,7 +565,7 @@
         (type == HIP_I1 || type == HIP_R1)) {
         ctx->hadb_entry =
                 hip_oppdb_get_hadb_entry_i1_r1(ctx->input_msg,
-                                               ctx->src_addr);
+                                               &ctx->src_addr);
     }
 #endif
 
@@ -734,18 +734,18 @@
      * newer address. This enables us to use the rendezvous server, while
      * not supporting the REA TLV. */
     hip_hadb_get_peer_addr(ctx->hadb_entry, &daddr);
-    if (ipv6_addr_cmp(&daddr, ctx->src_addr) != 0) {
+    if (ipv6_addr_cmp(&daddr, &ctx->src_addr) != 0) {
         HIP_DEBUG("Mapped address didn't match received address\n");
         HIP_DEBUG("Assuming that the mapped address was actually RVS's.\n");
         HIP_HEXDUMP("Mapping", &daddr, 16);
-        HIP_HEXDUMP("Received", ctx->src_addr, 16);
+        HIP_HEXDUMP("Received", &ctx->src_addr, 16);
         hip_hadb_delete_peer_addrlist_one_old(ctx->hadb_entry, &daddr);
         hip_hadb_add_peer_addr(ctx->hadb_entry,
-                               ctx->src_addr,
+                               &ctx->src_addr,
                                0,
                                0,
                                PEER_ADDR_STATE_ACTIVE,
-                               ctx->msg_ports->src_port);
+                               ctx->msg_ports.src_port);
     }
 
     hip_relay_add_rvs_to_ha(ctx->input_msg, ctx->hadb_entry);
@@ -845,7 +845,7 @@
      * the peer is behind NAT. We set NAT mode "on" and set the send function to
      * "hip_send_udp". The client UDP port is not stored until the handling
      * of R2 packet. Don't know if the entry is already locked... */
-    if (ctx->msg_ports->dst_port != 0) {
+    if (ctx->msg_ports.dst_port != 0) {
         HIP_LOCK_HA(ctx->hadb_entry);
         if (ctx->hadb_entry->nat_mode == HIP_NAT_MODE_NONE) {
             ctx->hadb_entry->nat_mode = HIP_NAT_MODE_PLAIN_UDP;
@@ -899,13 +899,9 @@
         solved_puzzle = ctx->hadb_entry->puzzle_solution;
     }
 
-    /* Allocate space for a new I2 message. */
-    HIP_IFEL(!(ctx->output_msg = hip_msg_alloc()),
-             -ENOMEM,
-             "Allocation of I2 failed\n");
-
     HIP_DEBUG("Build normal I2.\n");
     /* create I2 */
+    hip_msg_init(ctx->output_msg);
     hip_build_network_hdr(ctx->output_msg,
                           HIP_I2,
                           i2_mask,
@@ -1104,9 +1100,9 @@
     }
 
     /* if the NAT mode is used, update the port numbers of the host association */
-    if (ctx->msg_ports->dst_port == hip_get_local_nat_udp_port()) {
-        ctx->hadb_entry->local_udp_port = ctx->msg_ports->dst_port;
-        ctx->hadb_entry->peer_udp_port  = ctx->msg_ports->src_port;
+    if (ctx->msg_ports.dst_port == hip_get_local_nat_udp_port()) {
+        ctx->hadb_entry->local_udp_port = ctx->msg_ports.dst_port;
+        ctx->hadb_entry->peer_udp_port  = ctx->msg_ports.src_port;
     }
 
     HIP_IFEL(!(esp_info = hip_get_param(ctx->input_msg, HIP_PARAM_ESP_INFO)),
@@ -1133,7 +1129,7 @@
     HIP_DEBUG("esp_transform: %i\n", tfm);
 
     HIP_DEBUG("R2 packet source port: %d, destination port %d.\n",
-              ctx->msg_ports->src_port, ctx->msg_ports->dst_port);
+              ctx->msg_ports.src_port, ctx->msg_ports.dst_port);
 
     /********** ESP-PROT anchor [OPTIONAL] **********/
     HIP_IFEL(esp_prot_r2_handle_anchor(ctx->hadb_entry,
@@ -1149,8 +1145,8 @@
 
     HIP_DEBUG_HIT("hit our", &(ctx->hadb_entry)->hit_our);
     HIP_DEBUG_HIT("hit peer", &(ctx->hadb_entry)->hit_peer);
-    HIP_IFEL(hip_add_sa(ctx->src_addr,
-                        ctx->dst_addr,
+    HIP_IFEL(hip_add_sa(&ctx->src_addr,
+                        &ctx->dst_addr,
                         &ctx->input_msg->hits,
                         &ctx->input_msg->hitr,
                         spi_in,
@@ -1163,8 +1159,8 @@
             -1,
             "Failed to setup IPsec SPD/SA entries, peer:src\n");
 
-    HIP_IFEL(hip_add_sa(ctx->dst_addr,
-                        ctx->src_addr,
+    HIP_IFEL(hip_add_sa(&ctx->dst_addr,
+                        &ctx->src_addr,
                         &ctx->input_msg->hitr,
                         &ctx->input_msg->hits,
                         spi_recvd,
@@ -1183,7 +1179,7 @@
     /* Source IPv6 address is implicitly the preferred address after the
      * base exchange. */
 
-    idx = hip_devaddr2ifindex(ctx->dst_addr);
+    idx = hip_devaddr2ifindex(&ctx->dst_addr);
 
     if (idx != 0) {
         HIP_DEBUG("ifindex = %d\n", idx);
@@ -1273,7 +1269,7 @@
     hip_perf_start_benchmark(perf_set, PERF_I1);
 #endif
     HIP_INFO_HIT("I1 Source HIT:", &(ctx->input_msg)->hits);
-    HIP_INFO_IN6ADDR("I1 Source IP :", ctx->src_addr);
+    HIP_INFO_IN6ADDR("I1 Source IP :", &ctx->src_addr);
 
     HIP_ASSERT(!ipv6_addr_any(&(ctx->input_msg)->hitr));
 
@@ -1360,10 +1356,10 @@
     src_hit_is_our = hip_hidb_hit_is_our(&ctx->input_msg->hits);
 
     /* check i1 for broadcast/multicast addresses */
-    if (IN6_IS_ADDR_V4MAPPED(ctx->dst_addr)) {
+    if (IN6_IS_ADDR_V4MAPPED(&ctx->dst_addr)) {
         struct in_addr addr4;
 
-        IPV6_TO_IPV4_MAP(ctx->dst_addr, &addr4);
+        IPV6_TO_IPV4_MAP(&ctx->dst_addr, &addr4);
 
         if (addr4.s_addr == INADDR_BROADCAST) {
             HIP_DEBUG("Received I1 broadcast\n");
@@ -1372,17 +1368,17 @@
                     ctx->error = 1,
                     "Received a copy of own broadcast, dropping\n");
 
-            HIP_IFF(hip_select_source_address(ctx->dst_addr, ctx->src_addr),
+            HIP_IFF(hip_select_source_address(&ctx->dst_addr, &ctx->src_addr),
                     -1,
                     ctx->error = 1,
                     "Could not find source address\n");
         }
-    } else if (IN6_IS_ADDR_MULTICAST(ctx->dst_addr)) {
+    } else if (IN6_IS_ADDR_MULTICAST(&ctx->dst_addr)) {
         HIP_IFF(src_hit_is_our,
                 -1,
                 ctx->error = 1,
                 "Received a copy of own broadcast, dropping\n");
-        HIP_IFF(hip_select_source_address(ctx->dst_addr, ctx->src_addr),
+        HIP_IFF(hip_select_source_address(&ctx->dst_addr, &ctx->src_addr),
                 -1,
                 ctx->error = 1,
                 "Could not find source address\n");
@@ -1466,7 +1462,7 @@
     HIP_DEBUG("Received I2 in state %s\n", hip_state_str(ha_state));
     HIP_INFO("Received I2 from:\n");
     HIP_INFO_HIT("Source HIT:", &ctx->input_msg->hits);
-    HIP_INFO_IN6ADDR("Source IP: ", ctx->src_addr);
+    HIP_INFO_IN6ADDR("Source IP: ", &ctx->src_addr);
 
     /* Next, we initialize the new HIP association. Peer HIT is the
       * source HIT of the received I2 packet. We can have many Host
@@ -1488,7 +1484,7 @@
                   "association. Dropping the I2 packet.\n");
      }
      ipv6_addr_copy(&ctx->hadb_entry->hit_peer, &ctx->input_msg->hits);
-     ipv6_addr_copy(&ctx->hadb_entry->our_addr, ctx->dst_addr);
+     ipv6_addr_copy(&ctx->hadb_entry->our_addr, &ctx->dst_addr);
      HIP_DEBUG("Initializing the HIP association.\n");
      hip_init_us(ctx->hadb_entry, &ctx->input_msg->hitr);
      hip_hadb_insert_state(ctx->hadb_entry);
@@ -1502,8 +1498,8 @@
              -ENODATA,
              "SOLUTION parameter missing from I2 packet. Dropping\n");
 
-    HIP_IFEL(hip_verify_cookie(ctx->src_addr,
-                               ctx->dst_addr,
+    HIP_IFEL(hip_verify_cookie(&ctx->src_addr,
+                               &ctx->dst_addr,
                                ctx->input_msg,
                                solution),
              -EPROTO,
@@ -1762,12 +1758,12 @@
      * stored as the peer UDP port and send function is set to
      * "hip_send_pkt()". Note that we must store the port not until
      * here, since the source port can be different for I1 and I2. */
-    if (ctx->msg_ports->dst_port != 0) {
+    if (ctx->msg_ports.dst_port != 0) {
         if (ctx->hadb_entry->nat_mode == 0) {
             ctx->hadb_entry->nat_mode = HIP_NAT_MODE_PLAIN_UDP;
         }
-        ctx->hadb_entry->local_udp_port = ctx->msg_ports->dst_port;
-        ctx->hadb_entry->peer_udp_port  = ctx->msg_ports->src_port;
+        ctx->hadb_entry->local_udp_port = ctx->msg_ports.dst_port;
+        ctx->hadb_entry->peer_udp_port  = ctx->msg_ports.src_port;
         HIP_DEBUG("Setting send func to UDP for entry %p from I2 info.\n",
                   ctx->hadb_entry);
         /** @todo Is this function set needed ? */
@@ -1801,11 +1797,11 @@
              "Could not select proper ESP transform\n");
 
     HIP_IFEL(hip_hadb_add_peer_addr(ctx->hadb_entry,
-                                    ctx->src_addr,
+                                    &ctx->src_addr,
                                     0,
                                     0,
                                     PEER_ADDR_STATE_ACTIVE,
-                                    ctx->msg_ports->src_port),
+                                    ctx->msg_ports.src_port),
              -1,
              "Error while adding the preferred peer address\n");
 
@@ -1823,8 +1819,8 @@
     /************************************************/
 
     /* Set up IPsec associations */
-    err = hip_add_sa(ctx->src_addr,
-                     ctx->dst_addr,
+    err = hip_add_sa(&ctx->src_addr,
+                     &ctx->dst_addr,
                      &ctx->input_msg->hits,
                      &ctx->input_msg->hitr,
                      ctx->hadb_entry->spi_inbound_current,
@@ -1850,8 +1846,8 @@
 
     HIP_IFEL(hip_setup_hit_sp_pair(&ctx->input_msg->hits,
                                    &ctx->input_msg->hitr,
-                                   ctx->src_addr,
-                                   ctx->dst_addr,
+                                   &ctx->src_addr,
+                                   &ctx->dst_addr,
                                    IPPROTO_ESP,
                                    1,
                                    1),
@@ -1860,7 +1856,7 @@
 
     memset(&spi_in_data, 0, sizeof(struct hip_spi_in_item));
     spi_in_data.spi     = ctx->hadb_entry->spi_inbound_current;
-    spi_in_data.ifindex = hip_devaddr2ifindex(ctx->dst_addr);
+    spi_in_data.ifindex = hip_devaddr2ifindex(&ctx->dst_addr);
 
     if (spi_in_data.ifindex) {
         HIP_DEBUG("spi_in_data.ifindex = %d.\n", spi_in_data.ifindex);
@@ -2059,11 +2055,7 @@
                     port = hip_get_peer_nat_udp_port();
                 }
 
-                /* We don't need to use hip_msg_alloc(), since
-                 * the I1 packet is just the size of struct
-                 * hip_common. */
-                memset(ctx->output_msg, 0, sizeof(ctx->output_msg));
-
+                hip_msg_init(ctx->output_msg);
                 hip_build_network_hdr(ctx->output_msg,
                                       response,
                                       ctx->hadb_entry->local_controls,

=== modified file 'hipd/oppdb.c'
--- hipd/oppdb.c	2010-08-20 14:34:13 +0000
+++ hipd/oppdb.c	2010-09-09 01:12:24 +0000
@@ -491,8 +491,8 @@
     HIP_IFEL(hip_hadb_add_peer_info_complete(&ctx->input_msg->hitr,
                                              &ctx->input_msg->hits,
                                              NULL,
-                                             ctx->dst_addr,
-                                             ctx->src_addr,
+                                             &ctx->dst_addr,
+                                             &ctx->src_addr,
                                              NULL),
              -1, "Failed to insert peer map\n");
 
@@ -515,15 +515,15 @@
     HIP_DEBUG_HIT("peer hit", &ctx->input_msg->hits);
     HIP_DEBUG_HIT("local hit", &ctx->input_msg->hitr);
 
-    HIP_IFEL(hip_opportunistic_ipv6_to_hit(ctx->src_addr, &phit,
+    HIP_IFEL(hip_opportunistic_ipv6_to_hit(&ctx->src_addr, &phit,
                                            HIP_HIT_TYPE_HASH100),
              -1, "pseudo hit conversion failed\n");
 
     ipv6_addr_copy(&opp_info.real_peer_hit, &ctx->input_msg->hits);
     ipv6_addr_copy(&opp_info.pseudo_peer_hit, &phit);
     ipv6_addr_copy(&opp_info.local_hit, &ctx->input_msg->hitr);
-    ipv6_addr_copy(&opp_info.local_addr, ctx->dst_addr);
-    ipv6_addr_copy(&opp_info.peer_addr, ctx->src_addr);
+    ipv6_addr_copy(&opp_info.local_addr, &ctx->dst_addr);
+    ipv6_addr_copy(&opp_info.peer_addr, &ctx->src_addr);
 
     hip_for_each_opp(hip_oppdb_unblock_group, &opp_info);
     hip_del_peer_info_entry(opp_entry);

=== modified file 'hipd/output.c'
--- hipd/output.c	2010-08-20 14:34:13 +0000
+++ hipd/output.c	2010-09-09 01:12:24 +0000
@@ -276,8 +276,8 @@
      * of the REG_INFO parameter. */
 
     HIP_DEBUG("R1 source port %u, destination port %d\n",
-              ctx->msg_ports->src_port,
-              ctx->msg_ports->dst_port);
+              ctx->msg_ports.src_port,
+              ctx->msg_ports.dst_port);
 
     HIP_ASSERT(ctx->hadb_entry);
 
@@ -441,11 +441,11 @@
      * try to set up inbound IPsec SA, similarly as in hip_send_r2 */
 
     HIP_DEBUG("src %d, dst %d\n",
-              ctx->msg_ports->src_port,
-              ctx->msg_ports->dst_port);
+              ctx->msg_ports.src_port,
+              ctx->msg_ports.dst_port);
 
-    ctx->hadb_entry->local_udp_port = ctx->msg_ports->src_port;
-    ctx->hadb_entry->peer_udp_port  = ctx->msg_ports->dst_port;
+    ctx->hadb_entry->local_udp_port = ctx->msg_ports.src_port;
+    ctx->hadb_entry->peer_udp_port  = ctx->msg_ports.dst_port;
 
     ctx->hadb_entry->hip_transform  = transform_hip_suite;
 
@@ -454,7 +454,7 @@
 
     HIP_IFEL(hip_setup_hit_sp_pair(&ctx->input_msg->hits,
                                    &ctx->input_msg->hitr,
-                                   ctx->src_addr, ctx->dst_addr,
+                                   &ctx->src_addr, &ctx->dst_addr,
                                    IPPROTO_ESP,
                                    1,
                                    1),
@@ -517,7 +517,7 @@
     /********** I2 packet complete **********/
     memset(&spi_in_data, 0, sizeof(struct hip_spi_in_item));
     spi_in_data.spi     = spi_in;
-    spi_in_data.ifindex = hip_devaddr2ifindex(ctx->dst_addr);
+    spi_in_data.ifindex = hip_devaddr2ifindex(&ctx->dst_addr);
     HIP_LOCK_HA(ctx->hadb_entry);
 
     /* 99999 HIP_IFEB(hip_hadb_add_spi_old(ctx->hadb_entry,
@@ -535,9 +535,9 @@
     HIP_IFE(hip_hadb_get_peer_addr(ctx->hadb_entry, &daddr), -1);
 
     /* R1 packet source port becomes the I2 packet destination port. */
-    err = hip_send_pkt(ctx->dst_addr, &daddr,
+    err = hip_send_pkt(&ctx->dst_addr, &daddr,
                        (ctx->hadb_entry->nat_mode ? hip_get_local_nat_udp_port() : 0),
-                       ctx->msg_ports->src_port, ctx->output_msg, ctx->hadb_entry, 1);
+                       ctx->msg_ports.src_port, ctx->output_msg, ctx->hadb_entry, 1);
     HIP_IFEL(err < 0, -ECOMM, "Sending I2 packet failed.\n");
 
     HIP_IFEL(err < 0, -1, "Creation of I2 failed\n");
@@ -547,9 +547,6 @@
     }
 
 out_err:
-    if (ctx->output_msg) {
-        free(ctx->output_msg);
-    }
 #ifdef CONFIG_HIP_PERFORMANCE
     HIP_DEBUG("Stop and write PERF_R1\n");
     hip_perf_stop_benchmark(perf_set, PERF_R1);
@@ -777,7 +774,7 @@
     struct in6_addr dst_ip      = IN6ADDR_ANY_INIT,
                *r1_dst_addr     = NULL,
                *local_plain_hit = NULL,
-               *r1_src_addr     = ctx->dst_addr;
+               *r1_src_addr     = &ctx->dst_addr;
     in_port_t r1_dst_port       = 0;
     int relay_para_type         = 0;
 
@@ -785,12 +782,12 @@
              -1,
              "Abort packet processing and don't send R1 packet.\n")
 
-    HIP_DEBUG_IN6ADDR("i1_saddr", ctx->src_addr);
-    HIP_DEBUG_IN6ADDR("i1_daddr", ctx->dst_addr);
+    HIP_DEBUG_IN6ADDR("i1_saddr", &ctx->src_addr);
+    HIP_DEBUG_IN6ADDR("i1_daddr", &ctx->dst_addr);
     HIP_DEBUG_IN6ADDR("dst_ip", &dst_ip);
 
     relay_para_type = hip_relay_handle_relay_from(ctx->input_msg,
-                                                  ctx->src_addr,
+                                                  &ctx->src_addr,
                                                   &dst_ip, &r1_dst_port);
 
     /* Get the final destination address and port for the outgoing R1.
@@ -801,13 +798,13 @@
         if (relay_para_type == HIP_PARAM_RELAY_FROM) {
             HIP_DEBUG("Param relay from\n");
             //from relay
-            r1_dst_addr = ctx->src_addr;
-            r1_dst_port = ctx->msg_ports->src_port;
+            r1_dst_addr = &ctx->src_addr;
+            r1_dst_port = ctx->msg_ports.src_port;
         } else if (relay_para_type == HIP_PARAM_FROM)    {
             HIP_DEBUG("Param from\n");
             //from RVS, answer to I
             r1_dst_addr =  &dst_ip;
-            if (ctx->msg_ports->src_port) {
+            if (ctx->msg_ports.src_port) {
                 // R and RVS is in the UDP mode or I send UDP to RVS with incoming port hip_get_peer_nat_udp_port()
                 r1_dst_port =  hip_get_peer_nat_udp_port();
             } else {
@@ -818,8 +815,8 @@
     } else {
         HIP_DEBUG("No RVS or relay\n");
         /* no RVS or RELAY found;  direct connection */
-        r1_dst_addr = ctx->src_addr;
-        r1_dst_port = ctx->msg_ports->src_port;
+        r1_dst_addr = &ctx->src_addr;
+        r1_dst_port = ctx->msg_ports.src_port;
     }
 
 #ifdef CONFIG_HIP_OPPORTUNISTIC
@@ -842,7 +839,7 @@
         }
     }
 
-    HIP_IFEL(!(r1pkt = hip_get_r1(r1_dst_addr, ctx->dst_addr,
+    HIP_IFEL(!(r1pkt = hip_get_r1(r1_dst_addr, &ctx->dst_addr,
                                   &ctx->input_msg->hitr)),
              -ENOENT, "No precreated R1\n");
 
@@ -866,7 +863,7 @@
             hip_build_param_relay_to(r1pkt, &dst_ip, r1_dst_port);
         } else if (relay_para_type == HIP_PARAM_FROM)    {
             HIP_DEBUG("Build param via_rvs\n");
-            hip_build_param_via_rvs(r1pkt, ctx->src_addr);
+            hip_build_param_via_rvs(r1pkt, &ctx->src_addr);
         }
     }
 #endif
@@ -928,7 +925,7 @@
              "Abort packet processing and don't send R1 packet.\n")
 
     /* Build and send R2: IP ( HIP ( SPI, HMAC, HIP_SIGNATURE ) ) */
-    HIP_IFEL(!(ctx->output_msg = hip_msg_alloc()), -ENOMEM, "No memory for R2\n");
+    hip_msg_init(ctx->output_msg);
 
     /* Just swap the addresses to use the I2's destination HIT as the R2's
      * source HIT. */
@@ -983,7 +980,7 @@
                                  ctx->input_msg, ctx->output_msg);
     if (hip_relay_get_status() != HIP_RELAY_OFF) {
         hip_build_param_reg_from(ctx->output_msg,
-                                 ctx->src_addr, ctx->msg_ports->src_port);
+                                 &ctx->src_addr, ctx->msg_ports.src_port);
     }
 #endif
 
@@ -1016,7 +1013,7 @@
         in_port_t dst_port = 0;
 
         memset(&dst, 0, sizeof(dst));
-        if ((hip_relay_handle_relay_from(ctx->input_msg, ctx->src_addr,
+        if ((hip_relay_handle_relay_from(ctx->input_msg, &ctx->src_addr,
                                          &dst, &dst_port) > 0) &&
             !ipv6_addr_any(&dst)) {
             HIP_DEBUG("create relay_to parameter in R2\n");
@@ -1025,8 +1022,8 @@
     }
 #endif
 
-    err = hip_add_sa(ctx->dst_addr,
-                     ctx->src_addr,
+    err = hip_add_sa(&ctx->dst_addr,
+                     &ctx->src_addr,
                      &ctx->input_msg->hitr,
                      &ctx->input_msg->hits,
                      ctx->hadb_entry->spi_outbound_current,
@@ -1049,8 +1046,8 @@
     HIP_DEBUG("Set up outbound IPsec SA, SPI=0x%x\n",
               ctx->hadb_entry->spi_outbound_new);
 
-    err = hip_send_pkt(ctx->dst_addr,
-                       ctx->src_addr,
+    err = hip_send_pkt(&ctx->dst_addr,
+                       &ctx->src_addr,
                        (ctx->hadb_entry->nat_mode ? hip_get_local_nat_udp_port() : 0),
                        ctx->hadb_entry->peer_udp_port,
                        ctx->output_msg,
@@ -1064,9 +1061,6 @@
     HIP_IFEL(err, -ECOMM, "Sending R2 packet failed.\n");
 
 out_err:
-    if (ctx->output_msg) {
-        free(ctx->output_msg);
-    }
 #ifdef CONFIG_HIP_PERFORMANCE
     HIP_DEBUG("Stop and write PERF_I2\n");
     hip_perf_stop_benchmark(perf_set, PERF_I2);

=== modified file 'hipd/output.h'
--- hipd/output.h	2010-08-19 09:32:20 +0000
+++ hipd/output.h	2010-09-09 01:12:24 +0000
@@ -63,7 +63,7 @@
                          struct in6_addr *r2_saddr,
                          struct in6_addr *r2_daddr,
                          hip_ha_t *entry,
-                         hip_portpair_t *r2_info);
+                         struct hip_portpair_t *r2_info);
 
 int hip_send_i1(hip_hit_t *, const hip_hit_t *, hip_ha_t *);
 

=== modified file 'lib/core/message.c'
--- lib/core/message.c	2010-07-14 15:58:20 +0000
+++ lib/core/message.c	2010-09-09 01:12:24 +0000
@@ -558,9 +558,6 @@
 
     hip_msg_init(ctx->input_msg);
 
-    HIP_ASSERT(ctx->src_addr);
-    HIP_ASSERT(ctx->dst_addr);
-
     HIP_DEBUG("hip_read_control_msg_all() invoked.\n");
 
 //    memset(msg_info, 0, sizeof(hip_portpair_t));
@@ -613,31 +610,31 @@
     /* UDP port numbers */
     if (is_ipv4 && encap_hdr_size == HIP_UDP_ZERO_BYTES_LEN) {
         HIP_DEBUG("source port = %d\n", ntohs(addr_from4->sin_port));
-        ctx->msg_ports->src_port = ntohs(addr_from4->sin_port);
+        ctx->msg_ports.src_port = ntohs(addr_from4->sin_port);
         /* Destination port is known from the bound socket. */
-        ctx->msg_ports->dst_port = hip_get_local_nat_udp_port();
+        ctx->msg_ports.dst_port = hip_get_local_nat_udp_port();
     } else {
-        ctx->msg_ports->src_port = 0;
-        ctx->msg_ports->dst_port = 0;
+        ctx->msg_ports.src_port = 0;
+        ctx->msg_ports.dst_port = 0;
    }
 
     /* IPv4 addresses */
     if (is_ipv4) {
         struct sockaddr_in *addr_to4 = (struct sockaddr_in *) &addr_to;
-        IPV4_TO_IPV6_MAP(&addr_from4->sin_addr, ctx->src_addr);
-        IPV4_TO_IPV6_MAP(&pktinfo.pktinfo_in4->ipi_addr, ctx->dst_addr);
+        IPV4_TO_IPV6_MAP(&addr_from4->sin_addr, &ctx->src_addr);
+        IPV4_TO_IPV6_MAP(&pktinfo.pktinfo_in4->ipi_addr, &ctx->dst_addr);
         addr_to4->sin_family = AF_INET;
         addr_to4->sin_addr   = pktinfo.pktinfo_in4->ipi_addr;
-        addr_to4->sin_port   = ctx->msg_ports->dst_port;
+        addr_to4->sin_port   = ctx->msg_ports.dst_port;
     } else {   /* IPv6 addresses */
         struct sockaddr_in6 *addr_to6 =
             (struct sockaddr_in6 *) &addr_to;
-        memcpy(ctx->src_addr, &addr_from6->sin6_addr,
+        memcpy(&ctx->src_addr, &addr_from6->sin6_addr,
                sizeof(struct in6_addr));
-        memcpy(ctx->dst_addr, &pktinfo.pktinfo_in6->ipi6_addr,
+        memcpy(&ctx->dst_addr, &pktinfo.pktinfo_in6->ipi6_addr,
                sizeof(struct in6_addr));
         addr_to6->sin6_family = AF_INET6;
-        ipv6_addr_copy(&addr_to6->sin6_addr, ctx->dst_addr);
+        ipv6_addr_copy(&addr_to6->sin6_addr, &ctx->dst_addr);
     }
 
     if (is_ipv4 && (encap_hdr_size == IPV4_HDR_SIZE)) {    /* raw IPv4, !UDP */
@@ -661,12 +658,8 @@
 
 
 
-    if (ctx->src_addr) {
-        HIP_DEBUG_IN6ADDR("src", ctx->src_addr);
-    }
-    if (ctx->dst_addr) {
-        HIP_DEBUG_IN6ADDR("dst", ctx->dst_addr);
-    }
+    HIP_DEBUG_IN6ADDR("src", &ctx->src_addr);
+    HIP_DEBUG_IN6ADDR("dst", &ctx->dst_addr);
 
 out_err:
     return err;

=== modified file 'lib/core/protodefs.h'
--- lib/core/protodefs.h	2010-08-17 17:23:18 +0000
+++ lib/core/protodefs.h	2010-09-09 01:12:24 +0000
@@ -1128,18 +1128,24 @@
 } __attribute__ ((packed));
 
 /**
- * Structure used during packet handling to store the incoming message,
- * source address, destination address, the used ports, the host association
- * database entry and a flag indicating the packet handling should be aborted.
+ * A data structure for storing the source and destination ports of a packet.
+ */
+struct hip_portpair_t {
+    in_port_t src_port;     /**< The source port of an incoming packet. */
+    in_port_t dst_port;     /**< The destination port of an incoming packet. */
+};
+
+/**
+ * Structure used to pass information around during packet handling.
  */
 struct hip_packet_context {
-    struct hip_common         *input_msg;
-    struct hip_common         *output_msg;
-    struct in6_addr           *src_addr;
-    struct in6_addr           *dst_addr;
-    struct hip_stateless_info *msg_ports;
-    struct hip_hadb_state     *hadb_entry;
-    uint8_t                    error;
+    struct hip_common         *input_msg;  /**< Incoming message. */
+    struct hip_common         *output_msg; /**< Outgoing message. */
+    struct in6_addr            src_addr;   /**< Packet origin. */
+    struct in6_addr            dst_addr;   /**< Packet destination. */
+    struct hip_portpair_t      msg_ports;  /**< Used ports. */
+    struct hip_hadb_state     *hadb_entry; /**< Host association database entry. */
+    uint8_t                    error;      /**< Abort further processing if not 0 */
 };
 
 

=== modified file 'lib/core/state.h'
--- lib/core/state.h	2010-07-14 16:01:50 +0000
+++ lib/core/state.h	2010-09-09 01:12:24 +0000
@@ -111,15 +111,6 @@
 } hip_hastate_t;
 
 /**
- * A data structure for storing the source and destination ports of an incoming
- * packet.
- */
-typedef struct hip_stateless_info {
-    in_port_t src_port;     /**< The source port of an incoming packet. */
-    in_port_t dst_port;     /**< The destination port of an incoming packet. */
-} hip_portpair_t;
-
-/**
  * A data structure for handling retransmission. Used inside host association
  * database entries.
  */

=== modified file 'lib/tool/xfrmapi.h'
--- lib/tool/xfrmapi.h	2010-06-08 19:54:28 +0000
+++ lib/tool/xfrmapi.h	2010-09-09 01:12:24 +0000
@@ -31,7 +31,7 @@
 void hip_xfrm_set_nl_ipsec(struct rtnl_handle *nl_ipsec);
 int hip_xfrm_dst_init(struct in6_addr *dst_hit, struct in6_addr *dst_addr);
 int hip_xfrm_update(hip_hit_t *hit, hip_hit_t *hit2, struct in6_addr *addr,
-                    uint32_t spi, int state, int dir, hip_portpair_t *sa_info);
+                    uint32_t spi, int state, int dir, struct hip_portpair_t *sa_info);
 int hip_xfrm_delete(hip_hit_t *hit, uint32_t spi, int dir);
 
 /* Setups the SA (with a given SPI if so said) */

=== modified file 'modules/update/hipd/update.c'
--- modules/update/hipd/update.c	2010-08-29 16:24:14 +0000
+++ modules/update/hipd/update.c	2010-09-09 01:12:24 +0000
@@ -1049,9 +1049,9 @@
 
    /* set local UDP port just in case the original communications
       changed from raw to UDP or vice versa */
-    ctx->hadb_entry->local_udp_port = ctx->msg_ports->dst_port;
+    ctx->hadb_entry->local_udp_port = ctx->msg_ports.dst_port;
     /* @todo: a workaround for bug id 592200 */
-    ctx->hadb_entry->peer_udp_port = ctx->msg_ports->src_port;
+    ctx->hadb_entry->peer_udp_port = ctx->msg_ports.src_port;
 
     /* RFC 5206: End-Host Mobility and Multihoming.
      * 3.2.1. Mobility with a Single SA Pair (No Rekeying)
@@ -1063,7 +1063,7 @@
     if (locator) {
         err = hip_handle_first_update_packet(ctx->input_msg,
                                              ctx->hadb_entry,
-                                             ctx->src_addr);
+                                             &ctx->src_addr);
         goto out_err;
     } else if (echo_request) {
         /* Ignore the ECHO REQUESTS with the same SEQ after processing the first
@@ -1077,13 +1077,13 @@
          */
         hip_handle_second_update_packet(ctx->input_msg,
                                         ctx->hadb_entry,
-                                        ctx->dst_addr,
-                                        ctx->src_addr);
+                                        &ctx->dst_addr,
+                                        &ctx->src_addr);
         goto out_err;
     } else if (echo_response) {
         hip_handle_third_update_packet(ctx->hadb_entry,
-                                       ctx->dst_addr,
-                                       ctx->src_addr);
+                                       &ctx->dst_addr,
+                                       &ctx->src_addr);
         goto out_err;
     }
     else if (esp_prot_update_type(ctx->input_msg)
@@ -1091,8 +1091,8 @@
     {
        esp_prot_handle_first_update_packet(ctx->input_msg,
                                            ctx->hadb_entry,
-                                           ctx->src_addr,
-                                           ctx->dst_addr);
+                                           &ctx->src_addr,
+                                           &ctx->dst_addr);
 
        goto out_err;
     }
@@ -1100,8 +1100,8 @@
                 == ESP_PROT_SECOND_UPDATE_PACKET)
    {
        esp_prot_handle_second_update_packet(ctx->hadb_entry,
-                                            ctx->src_addr,
-                                            ctx->dst_addr);
+                                            &ctx->src_addr,
+                                            &ctx->dst_addr);
 
        goto out_err;
    }


Follow ups