static void dispose (GObject *object) { NMDeviceWimax *self = NM_DEVICE_WIMAX (object); NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (self); if (priv->disposed) goto done; priv->disposed = TRUE; clear_activation_timeout (self); clear_link_timeout (self); clear_connected_poll (self); if (priv->sdk_action_defer_id) g_source_remove (priv->sdk_action_defer_id); if (priv->sdk) { iwmx_sdk_set_callbacks (priv->sdk, NULL, NULL, NULL, NULL, NULL, NULL); wmxsdk_unref (priv->sdk); } g_free (priv->bsid); set_current_nsp (self, NULL); g_slist_free_full (priv->nsp_list, g_object_unref); iwmx_sdk_new_callback_unregister (wmx_new_sdk_cb, self); nm_wimax_util_sdk_unref (); done: G_OBJECT_CLASS (nm_device_wimax_parent_class)->dispose (object); }
static gboolean removed_handler(gpointer user_data) { struct wmxsdk *wmxsdk = user_data; if (wmxsdk->removed_cb) wmxsdk->removed_cb(wmxsdk, wmxsdk->callback_data); wmxsdk_unref(wmxsdk); return FALSE; }
static void iwmx_sdk_dev_add(unsigned idx, unsigned api_idx, const char *name) { struct wmxsdk *wmxsdk; const char *s; if (idx >= IWMX_SDK_DEV_MAX) { nm_log_err(LOGD_WIMAX, "BUG! idx (%u) >= IWMX_SDK_DEV_MAX (%u)", idx, IWMX_SDK_DEV_MAX); return; } if (g_iwmx_sdk_devs[idx] != NULL) { nm_log_err(LOGD_WIMAX, "BUG! device index %u already enumerated?", idx); return; } wmxsdk = wmxsdk_new(); if (wmxsdk == NULL) { nm_log_err(LOGD_WIMAX, "Can't allocate %zu bytes", sizeof(*wmxsdk)); return; } /* * This depends on a hack in the WiMAX Network Service; it has * to return, as part of the device name, a string "if:IFNAME" * where the OS's device name is stored. */ s = strstr(name, "if:"); if (s == NULL || sscanf(s, "if:%15[^ \f\n\r\t\v]", wmxsdk->ifname) != 1) { nm_log_err(LOGD_WIMAX, "Cannot extract network interface name off '%s'", name); goto error; } nm_log_dbg(LOGD_WIMAX, "network interface name: '%s'", wmxsdk->ifname); strncpy(wmxsdk->name, name, sizeof(wmxsdk->name)); wmxsdk->device_id.privilege = WIMAX_API_PRIVILEGE_READ_WRITE; wmxsdk->device_id.deviceIndex = api_idx; if (iwmx_sdk_setup(wmxsdk) != 0) { nm_log_err(LOGD_WIMAX, "wxmsdk: %s: cannot set up interface", wmxsdk->ifname); goto error; } g_iwmx_sdk_devs[idx] = wmxsdk; /* Notify listeners of new devices */ iwmx_sdk_call_new_callbacks (wmxsdk); return; error: wmxsdk_unref(wmxsdk); return; }
static gboolean connect_result_handler(gpointer user_data) { ConnectResultInfo *info = user_data; if (info->wmxsdk->connect_result_cb) { info->wmxsdk->connect_result_cb(info->wmxsdk, info->result, info->wmxsdk->callback_data); } wmxsdk_unref(info->wmxsdk); memset(info, 0, sizeof(*info)); free(info); return FALSE; }
static gboolean media_status_change_handler(gpointer user_data) { MediaStatusInfo *info = user_data; if (info->wmxsdk->media_status_cb) { info->wmxsdk->media_status_cb(info->wmxsdk, info->media_status, info->wmxsdk->callback_data); } wmxsdk_unref(info->wmxsdk); memset(info, 0, sizeof(*info)); free(info); return FALSE; }
static void iwmx_sdk_dev_rm(unsigned idx) { struct wmxsdk *wmxsdk; if (idx >= IWMX_SDK_DEV_MAX) { nm_log_err(LOGD_WIMAX, "BUG! idx (%u) >= IWMX_SDK_DEV_MAX (%u)", idx, IWMX_SDK_DEV_MAX); return; } wmxsdk = g_iwmx_sdk_devs[idx]; _schedule_removed(wmxsdk); iwmx_sdk_remove(wmxsdk); wmxsdk_unref(wmxsdk); g_iwmx_sdk_devs[idx] = NULL; }
static gboolean scan_result_handler(gpointer user_data) { ScanResultInfo *info = user_data; if (info->wmxsdk->scan_result_cb) { info->wmxsdk->scan_result_cb(info->wmxsdk, info->nsps, info->num_nsps, info->wmxsdk->callback_data); } wmxsdk_unref(info->wmxsdk); free(info->nsps); memset(info, 0, sizeof(*info)); free(info); return FALSE; }
static gboolean state_change_handler(gpointer user_data) { StateChangeInfo *info = user_data; if (info->wmxsdk->state_change_cb) { info->wmxsdk->state_change_cb(info->wmxsdk, info->new_status, info->old_status, info->reason, info->wmxsdk->callback_data); } wmxsdk_unref(info->wmxsdk); memset(info, 0, sizeof(*info)); free(info); return FALSE; }
static void wmx_removed_cb (struct wmxsdk *wmxsdk, void *user_data) { NMDeviceWimax *self = NM_DEVICE_WIMAX (user_data); NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (self); if (priv->sdk) { /* Clear callbacks just in case we don't hold the last reference */ iwmx_sdk_set_callbacks (priv->sdk, NULL, NULL, NULL, NULL, NULL, NULL); wmxsdk_unref (priv->sdk); priv->sdk = NULL; priv->status = WIMAX_API_DEVICE_STATUS_UnInitialized; nm_device_state_changed (NM_DEVICE (self), NM_DEVICE_STATE_UNAVAILABLE, NM_DEVICE_STATE_REASON_NONE); } }
static void wmx_removed_cb (struct wmxsdk *wmxsdk, void *user_data) { NMDeviceWimax *self = NM_DEVICE_WIMAX (user_data); NMDeviceWimaxPrivate *priv = NM_DEVICE_WIMAX_GET_PRIVATE (self); if (!priv->sdk) { nm_log_dbg (LOGD_WIMAX, "(%s): removed unhandled WiMAX interface", wmxsdk->ifname); return; } nm_log_dbg (LOGD_WIMAX, "(%s): removed WiMAX interface", wmxsdk->ifname); /* Clear callbacks just in case we don't hold the last reference */ iwmx_sdk_set_callbacks (priv->sdk, NULL, NULL, NULL, NULL, NULL, NULL); wmxsdk_unref (priv->sdk); priv->sdk = NULL; priv->status = WIMAX_API_DEVICE_STATUS_UnInitialized; nm_device_state_changed (NM_DEVICE (self), NM_DEVICE_STATE_UNAVAILABLE, NM_DEVICE_STATE_REASON_NONE); }