From 6695eb7423cb1393c36740b8ce6a73d9ff6a7ebe Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Tue, 20 Apr 2010 15:54:55 -0700 Subject: [PATCH] netlink: let clients get netlink message for generic parsing First step on the way to killing the IPv6-specific netlink listener. --- src/nm-netlink-monitor.c | 49 ++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/nm-netlink-monitor.c b/src/nm-netlink-monitor.c index df56cd7d53..21ea5ab3dd 100644 --- a/src/nm-netlink-monitor.c +++ b/src/nm-netlink-monitor.c @@ -47,7 +47,6 @@ #include "nm-system.h" #include "nm-netlink-monitor.h" #include "nm-logging.h" -#include "nm-marshal.h" #include "nm-netlink.h" #define EVENT_CONDITIONS ((GIOCondition) (G_IO_IN | G_IO_PRI)) @@ -70,19 +69,19 @@ typedef struct { } NMNetlinkMonitorPrivate; enum { - CARRIER_ON = 0, - CARRIER_OFF, - ERROR, - - LAST_SIGNAL + NOTIFICATION = 0, + CARRIER_ON, + CARRIER_OFF, + ERROR, + LAST_SIGNAL }; - static guint signals[LAST_SIGNAL] = { 0 }; + G_DEFINE_TYPE (NMNetlinkMonitor, nm_netlink_monitor, G_TYPE_OBJECT); static void -netlink_object_message_handler (struct nl_object *obj, void *arg) +link_msg_handler (struct nl_object *obj, void *arg) { NMNetlinkMonitor *monitor = NM_NETLINK_MONITOR (arg); GError *error; @@ -97,9 +96,7 @@ netlink_object_message_handler (struct nl_object *obj, void *arg) NM_NETLINK_MONITOR_ERROR_BAD_ALLOC, _("error processing netlink message: %s"), nl_geterror ()); - g_signal_emit (G_OBJECT (monitor), - signals[ERROR], - 0, error); + g_signal_emit (G_OBJECT (monitor), signals[ERROR], 0, error); g_error_free (error); return; } @@ -162,8 +159,13 @@ netlink_event_input (struct nl_msg *msg, void *arg) return NL_STOP; } - nl_msg_parse (msg, &netlink_object_message_handler, arg); - return NL_SKIP; + /* Let clients handle generic messages */ + g_signal_emit (self, signals[NOTIFICATION], 0, msg); + + /* Parse carrier messages */ + nl_msg_parse (msg, &link_msg_handler, self); + + return NL_OK; } static gboolean @@ -250,6 +252,9 @@ nm_netlink_monitor_open_connection (NMNetlinkMonitor *monitor, goto error; } + /* Enable unix socket peer credentials which we use for verifying that the + * sender of the message is actually the kernel. + */ if (nl_set_passcred (priv->nlh, 1) < 0) { g_set_error (error, NM_NETLINK_MONITOR_ERROR, NM_NETLINK_MONITOR_ERROR_NETLINK_CONNECT, @@ -381,12 +386,8 @@ deferred_emit_carrier_state (gpointer user_data) */ if (nl_cache_refill (priv->nlh, priv->nlh_link_cache)) { nm_log_err (LOGD_HW, "error updating link cache: %s", nl_geterror ()); - } else { - nl_cache_foreach_filter (priv->nlh_link_cache, - NULL, - netlink_object_message_handler, - monitor); - } + } else + nl_cache_foreach_filter (priv->nlh_link_cache, NULL, link_msg_handler, monitor); return FALSE; } @@ -557,6 +558,14 @@ nm_netlink_monitor_class_init (NMNetlinkMonitorClass *monitor_class) object_class->finalize = finalize; /* Signals */ + signals[NOTIFICATION] = + g_signal_new ("notification", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (NMNetlinkMonitorClass, notification), + NULL, NULL, g_cclosure_marshal_VOID__POINTER, + G_TYPE_NONE, 1, G_TYPE_POINTER); + signals[CARRIER_ON] = g_signal_new ("carrier-on", G_OBJECT_CLASS_TYPE (object_class), @@ -578,7 +587,7 @@ nm_netlink_monitor_class_init (NMNetlinkMonitorClass *monitor_class) G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (NMNetlinkMonitorClass, error), - NULL, NULL, _nm_marshal_VOID__POINTER, + NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); }