From 28e7946111f347cd22f1c872fff66c3725ea3583 Mon Sep 17 00:00:00 2001 From: Jukka Rissanen Date: Fri, 26 Apr 2013 09:51:31 +0300 Subject: dhcpv6: Retransmit a message with same transaction id Make sure we do not create a new transaction id for a message when it needs to be retransmitted. --- src/dhcpv6.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src') diff --git a/src/dhcpv6.c b/src/dhcpv6.c index 1d724e51..7315c394 100644 --- a/src/dhcpv6.c +++ b/src/dhcpv6.c @@ -271,6 +271,8 @@ static void info_req_cb(GDHCPClient *dhcp_client, gpointer user_data) return; } + g_dhcpv6_client_clear_retransmit(dhcp_client); + option = g_dhcp_client_get_option(dhcp_client, G_DHCPV6_DNS_SERVERS); entries = g_list_length(option); @@ -570,6 +572,7 @@ static void rebind_cb(GDHCPClient *dhcp_client, gpointer user_data) g_dhcpv6_client_reset_rebind(dhcp_client); g_dhcpv6_client_reset_renew(dhcp_client); + g_dhcpv6_client_clear_retransmit(dhcp_client); re_cb(dhcp_client, user_data); } @@ -652,6 +655,8 @@ static gboolean timeout_rebind(gpointer user_data) dhcp->timeout = g_timeout_add(dhcp->RT, timeout_rebind, dhcp); + g_dhcpv6_client_set_retransmit(dhcp->dhcp_client); + g_dhcp_client_start(dhcp->dhcp_client, NULL); return FALSE; @@ -676,6 +681,8 @@ static void request_cb(GDHCPClient *dhcp_client, gpointer user_data) { DBG(""); + g_dhcpv6_client_clear_retransmit(dhcp_client); + re_cb(dhcp_client, user_data); } @@ -733,6 +740,8 @@ static gboolean timeout_request(gpointer user_data) DBG("request RT timeout %d msec", dhcp->RT); dhcp->timeout = g_timeout_add(dhcp->RT, timeout_request, dhcp); + g_dhcpv6_client_set_retransmit(dhcp->dhcp_client); + g_dhcp_client_start(dhcp->dhcp_client, NULL); return FALSE; @@ -743,6 +752,7 @@ static void renew_cb(GDHCPClient *dhcp_client, gpointer user_data) DBG(""); g_dhcpv6_client_reset_renew(dhcp_client); + g_dhcpv6_client_clear_retransmit(dhcp_client); re_cb(dhcp_client, user_data); } @@ -795,6 +805,8 @@ static gboolean timeout_renew(gpointer user_data) dhcp->timeout = g_timeout_add(dhcp->RT, timeout_renew, dhcp); + g_dhcpv6_client_set_retransmit(dhcp->dhcp_client); + g_dhcp_client_start(dhcp->dhcp_client, NULL); return FALSE; @@ -979,6 +991,8 @@ static gboolean timeout_info_req(gpointer user_data) dhcp->timeout = g_timeout_add(dhcp->RT, timeout_info_req, dhcp); + g_dhcpv6_client_set_retransmit(dhcp->dhcp_client); + g_dhcp_client_start(dhcp->dhcp_client, NULL); return FALSE; @@ -1045,6 +1059,8 @@ static void advertise_cb(GDHCPClient *dhcp_client, gpointer user_data) clear_timer(dhcp); + g_dhcpv6_client_clear_retransmit(dhcp_client); + if (g_dhcpv6_client_get_status(dhcp_client) != 0) { if (dhcp->callback != NULL) dhcp->callback(dhcp->network, FALSE); @@ -1070,6 +1086,8 @@ static void solicitation_cb(GDHCPClient *dhcp_client, gpointer user_data) clear_timer(dhcp); set_addresses(dhcp_client, dhcp); + + g_dhcpv6_client_clear_retransmit(dhcp_client); } static gboolean timeout_solicitation(gpointer user_data) @@ -1082,6 +1100,8 @@ static gboolean timeout_solicitation(gpointer user_data) dhcp->timeout = g_timeout_add(dhcp->RT, timeout_solicitation, dhcp); + g_dhcpv6_client_set_retransmit(dhcp->dhcp_client); + g_dhcp_client_start(dhcp->dhcp_client, NULL); return FALSE; -- cgit v1.2.3