hipl-core team mailing list archive
-
hipl-core team
-
Mailing list archive
-
Message #00173
[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