return;
}
+static void __check_arp_sock_err(gpointer data)
+{
+ arping_data_s *arping_data;
+
+ if (!data || !g_p_arping_mon)
+ return;
+
+ arping_data = (arping_data_s *)data;
+ INM_LOGE("Socket error occured %d", arping_data->arp_data.sock);
+ util_recover_arp_sock(&(arping_data->arp_data));
+
+ return;
+}
+
static inline void __init_arping_data(arping_data_s *arping_data)
{
arping_data->arp_data.sock = -1;
arping_data->arp_data.recv_func = (user_arp_recv_func)__check_arp_receive;
+ arping_data->arp_data.err_func = (user_arp_err_func)__check_arp_sock_err;
arping_data->arp_data.user_data = arping_data;
return;
return;
}
+static void __check_arp_sock_err(gpointer data)
+{
+ ip_conflict_data_s *ip_conflict_data;
+
+ if (!data)
+ return;
+
+ ip_conflict_data = (ip_conflict_data_s *)data;
+ INM_LOGE("Socket error occured %d", ip_conflict_data->arp_data.sock);
+ util_recover_arp_sock(&(ip_conflict_data->arp_data));
+}
+
static inline void __init_ip_conflict_data(ip_conflict_data_s *ip_conflict_data)
{
ip_conflict_data->initial_bursts = TRUE;
ip_conflict_data->timeout = g_p_ip_conflict_mon->initial_time;
ip_conflict_data->arp_data.recv_func = (user_arp_recv_func)__check_arp_receive;
+ ip_conflict_data->arp_data.err_func = (user_arp_err_func)__check_arp_sock_err;
ip_conflict_data->arp_data.user_data = ip_conflict_data;
return;
}
+
static void __start_ip_conflict_mon(GQuark key_id,
gpointer value,
gpointer user_data)
ip_conflict_data->state = IP_CONFLICT_STATE_UNKNOWN;
return INM_IP_CONFLICT_ERROR_OPERATION_FAILED;
}
-
} else {
if (ip_conflict_data->arp_data.sock != -1) {
__stop_ip_conflict_mon(if_key, ip_conflict_data, NULL);
return;
}
-static gboolean __check_arp_receive(GIOChannel *source,
- GIOCondition condition, gpointer data)
+static void __arp_sock_io_in(GIOChannel *source, inm_util_arp_data_s *arp_data)
{
- inm_util_arp_data_s *user_data;
arp_message_s *ah = NULL;
gchar buf[ARP_PACKET_SIZE] = {0, };
gchar *ptr = NULL;
gsize bytes_read = 0;
GError *error = NULL;
+ INM_LOGI("Read channel");
if (g_io_channel_read_chars(source, buf, ARP_PACKET_SIZE,
&bytes_read, &error) != G_IO_STATUS_NORMAL) {
INM_LOGE("Failure received arp packet[%d]:[%s]",
error->code, error->message);
g_error_free(error);
- return TRUE;
+ return;
+ }
+ if (!arp_data) {
+ INM_LOGI("No data");
+ return;
}
- if (!data)
- return TRUE;
ptr = buf + ETH_HLEN;
ah = (arp_message_s *)ptr;
/* Only handle ARP replies */
- if (ah->arp_op != htons(ARPOP_REPLY))
- return TRUE;
+ if (ah->arp_op != htons(ARPOP_REPLY)) {
+ INM_LOGI("OP is not ARP reply from %d", arp_data->sock);
+ return;
+ }
+
+ INM_LOGI("Process from %d", arp_data->sock);
+ arp_data->recv_func(ah, arp_data->user_data);
+
+}
+
+static void __arp_sock_io_err(inm_util_arp_data_s *arp_data)
+{
+ if (!arp_data) {
+ INM_LOGI("No data");
+ return;
+ }
+ arp_data->err_func(arp_data->user_data);
+}
+
+static gboolean __check_arp_receive(GIOChannel *source,
+ GIOCondition condition, gpointer data)
+{
+ inm_util_arp_data_s *arp_data;
- user_data = (inm_util_arp_data_s *)data;
- user_data->recv_func(ah, user_data->user_data);
+ arp_data = (inm_util_arp_data_s *)data;
+ if (condition == G_IO_IN)
+ __arp_sock_io_in(source, arp_data);
+ else if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
+ __arp_sock_io_err(arp_data);
+ else
+ INM_LOGE("unrecognized condition %d", condition);
return TRUE;
}
arp_data->sock = sock;
arp_data->sock_source_id =
- g_io_add_watch(arp_data->sock_io_channel, G_IO_IN,
- __check_arp_receive, arp_data);
+ g_io_add_watch(arp_data->sock_io_channel,
+ G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
+ __check_arp_receive,
+ arp_data);
INM_LOGI("socket %d source_id %d", sock, arp_data->sock_source_id);