diff options
Diffstat (limited to 'src/dnsmasq')
| -rw-r--r-- | src/dnsmasq/nm-dnsmasq-manager.c | 516 | ||||
| -rw-r--r-- | src/dnsmasq/nm-dnsmasq-manager.h | 40 | ||||
| -rw-r--r-- | src/dnsmasq/nm-dnsmasq-utils.c | 152 | ||||
| -rw-r--r-- | src/dnsmasq/nm-dnsmasq-utils.h | 10 | ||||
| -rw-r--r-- | src/dnsmasq/tests/test-dnsmasq-utils.c | 290 |
5 files changed, 505 insertions, 503 deletions
diff --git a/src/dnsmasq/nm-dnsmasq-manager.c b/src/dnsmasq/nm-dnsmasq-manager.c index 5581f3fe..2dd4afcb 100644 --- a/src/dnsmasq/nm-dnsmasq-manager.c +++ b/src/dnsmasq/nm-dnsmasq-manager.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0+ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2008 - 2012 Red Hat, Inc. */ @@ -24,344 +24,332 @@ /*****************************************************************************/ enum { - STATE_CHANGED, - LAST_SIGNAL, + STATE_CHANGED, + LAST_SIGNAL, }; -static guint signals[LAST_SIGNAL] = { 0 }; +static guint signals[LAST_SIGNAL] = {0}; typedef struct { - char *iface; - char *pidfile; - GPid pid; - guint dm_watch_id; + char *iface; + char *pidfile; + GPid pid; + guint dm_watch_id; } NMDnsMasqManagerPrivate; struct _NMDnsMasqManager { - GObject parent; - NMDnsMasqManagerPrivate _priv; + GObject parent; + NMDnsMasqManagerPrivate _priv; }; struct _NMDnsMasqManagerClass { - GObjectClass parent; + GObjectClass parent; }; -G_DEFINE_TYPE (NMDnsMasqManager, nm_dnsmasq_manager, G_TYPE_OBJECT) +G_DEFINE_TYPE(NMDnsMasqManager, nm_dnsmasq_manager, G_TYPE_OBJECT) -#define NM_DNSMASQ_MANAGER_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMDnsMasqManager, NM_IS_DNSMASQ_MANAGER) +#define NM_DNSMASQ_MANAGER_GET_PRIVATE(self) \ + _NM_GET_PRIVATE(self, NMDnsMasqManager, NM_IS_DNSMASQ_MANAGER) /*****************************************************************************/ #define _NMLOG_DOMAIN LOGD_SHARING -#define _NMLOG(level, ...) __NMLOG_DEFAULT (level, _NMLOG_DOMAIN, "dnsmasq-manager", __VA_ARGS__) +#define _NMLOG(level, ...) __NMLOG_DEFAULT(level, _NMLOG_DOMAIN, "dnsmasq-manager", __VA_ARGS__) /*****************************************************************************/ static void -dm_watch_cb (GPid pid, int status, gpointer user_data) +dm_watch_cb(GPid pid, int status, gpointer user_data) { - NMDnsMasqManager *manager = NM_DNSMASQ_MANAGER (user_data); - NMDnsMasqManagerPrivate *priv = NM_DNSMASQ_MANAGER_GET_PRIVATE (manager); - guint err; - - if (WIFEXITED (status)) { - err = WEXITSTATUS (status); - if (err != 0) { - _LOGW ("dnsmasq exited with error: %s", - nm_utils_dnsmasq_status_to_string (err, NULL, 0)); - } - } else if (WIFSTOPPED (status)) { - _LOGW ("dnsmasq stopped unexpectedly with signal %d", WSTOPSIG (status)); - } else if (WIFSIGNALED (status)) { - _LOGW ("dnsmasq died with signal %d", WTERMSIG (status)); - } else { - _LOGW ("dnsmasq died from an unknown cause"); - } - - priv->pid = 0; - priv->dm_watch_id = 0; - - g_signal_emit (manager, signals[STATE_CHANGED], 0, NM_DNSMASQ_STATUS_DEAD); + NMDnsMasqManager * manager = NM_DNSMASQ_MANAGER(user_data); + NMDnsMasqManagerPrivate *priv = NM_DNSMASQ_MANAGER_GET_PRIVATE(manager); + guint err; + + if (WIFEXITED(status)) { + err = WEXITSTATUS(status); + if (err != 0) { + _LOGW("dnsmasq exited with error: %s", nm_utils_dnsmasq_status_to_string(err, NULL, 0)); + } + } else if (WIFSTOPPED(status)) { + _LOGW("dnsmasq stopped unexpectedly with signal %d", WSTOPSIG(status)); + } else if (WIFSIGNALED(status)) { + _LOGW("dnsmasq died with signal %d", WTERMSIG(status)); + } else { + _LOGW("dnsmasq died from an unknown cause"); + } + + priv->pid = 0; + priv->dm_watch_id = 0; + + g_signal_emit(manager, signals[STATE_CHANGED], 0, NM_DNSMASQ_STATUS_DEAD); } static GPtrArray * -create_dm_cmd_line (const char *iface, - const NMIP4Config *ip4_config, - const char *pidfile, - gboolean announce_android_metered, - GError **error) +create_dm_cmd_line(const char * iface, + const NMIP4Config *ip4_config, + const char * pidfile, + gboolean announce_android_metered, + GError ** error) { - gs_unref_ptrarray GPtrArray *cmd = NULL; - nm_auto_free_gstring GString *s = NULL; - char first[INET_ADDRSTRLEN]; - char last[INET_ADDRSTRLEN]; - char listen_address_s[INET_ADDRSTRLEN]; - char tmpaddr[INET_ADDRSTRLEN]; - gs_free char *error_desc = NULL; - const char *dm_binary; - const NMPlatformIP4Address *listen_address; - guint i, n; - - listen_address = nm_ip4_config_get_first_address (ip4_config); - - g_return_val_if_fail (listen_address, NULL); - - dm_binary = nm_utils_find_helper ("dnsmasq", DNSMASQ_PATH, error); - if (!dm_binary) - return NULL; - - cmd = g_ptr_array_new_with_free_func (g_free); - - nm_strv_ptrarray_add_string_dup (cmd, dm_binary); - - if ( nm_logging_enabled (LOGL_TRACE, LOGD_SHARING) - || getenv ("NM_DNSMASQ_DEBUG")) { - nm_strv_ptrarray_add_string_dup (cmd, "--log-dhcp"); - nm_strv_ptrarray_add_string_dup (cmd, "--log-queries"); - } - - /* dnsmasq may read from its default config file location, which if that - * location is a valid config file, it will combine with the options here - * and cause undesirable side-effects. Like sending bogus IP addresses - * as the gateway or whatever. So tell dnsmasq not to use any config file - * at all. - */ - nm_strv_ptrarray_add_string_dup (cmd, "--conf-file=/dev/null"); - - nm_strv_ptrarray_add_string_dup (cmd, "--no-hosts"); - nm_strv_ptrarray_add_string_dup (cmd, "--keep-in-foreground"); - nm_strv_ptrarray_add_string_dup (cmd, "--bind-interfaces"); - nm_strv_ptrarray_add_string_dup (cmd, "--except-interface=lo"); - nm_strv_ptrarray_add_string_dup (cmd, "--clear-on-reload"); - - /* Use strict order since in the case of VPN connections, the VPN's - * nameservers will be first in resolv.conf, and those need to be tried - * first by dnsmasq to successfully resolve names from the VPN. - */ - nm_strv_ptrarray_add_string_dup (cmd, "--strict-order"); - - _nm_utils_inet4_ntop (listen_address->address, listen_address_s); - - nm_strv_ptrarray_add_string_concat (cmd, "--listen-address=", listen_address_s); - - if (!nm_dnsmasq_utils_get_range (listen_address, first, last, &error_desc)) { - g_set_error_literal (error, - NM_MANAGER_ERROR, - NM_MANAGER_ERROR_FAILED, - error_desc); - _LOGW ("failed to find DHCP address ranges: %s", error_desc); - return NULL; - } - - nm_strv_ptrarray_add_string_printf (cmd, - "--dhcp-range=%s,%s,60m", - first, - last); - - if (nm_ip4_config_best_default_route_get (ip4_config)) { - nm_strv_ptrarray_add_string_concat (cmd, - "--dhcp-option=option:router,", - listen_address_s); - } - - if ((n = nm_ip4_config_get_num_nameservers (ip4_config))) { - nm_gstring_prepare (&s); - g_string_append (s, "--dhcp-option=option:dns-server"); - for (i = 0; i < n; i++) { - g_string_append_c (s, ','); - g_string_append (s, _nm_utils_inet4_ntop (nm_ip4_config_get_nameserver (ip4_config, i), tmpaddr)); - } - nm_strv_ptrarray_take_gstring (cmd, &s); - } - - if ((n = nm_ip4_config_get_num_searches (ip4_config))) { - nm_gstring_prepare (&s); - g_string_append (s, "--dhcp-option=option:domain-search"); - for (i = 0; i < n; i++) { - g_string_append_c (s, ','); - g_string_append (s, nm_ip4_config_get_search (ip4_config, i)); - } - nm_strv_ptrarray_take_gstring (cmd, &s); - } - - if (announce_android_metered) { - /* force option 43 to announce ANDROID_METERED. Do this, even if the client - * did not ask for this option. See https://www.lorier.net/docs/android-metered.html */ - nm_strv_ptrarray_add_string_dup (cmd, "--dhcp-option-force=43,ANDROID_METERED"); - } - - nm_strv_ptrarray_add_string_dup (cmd, "--dhcp-lease-max=50"); - - nm_strv_ptrarray_add_string_printf (cmd, - "--dhcp-leasefile=%s/dnsmasq-%s.leases", - NMSTATEDIR, - iface); - - nm_strv_ptrarray_add_string_concat (cmd, "--pid-file=", pidfile); - - /* dnsmasq exits if the conf dir is not present */ - if (g_file_test (CONFDIR, G_FILE_TEST_IS_DIR)) - nm_strv_ptrarray_add_string_dup (cmd, "--conf-dir=" CONFDIR); - - g_ptr_array_add (cmd, NULL); - return g_steal_pointer (&cmd); + gs_unref_ptrarray GPtrArray *cmd = NULL; + nm_auto_free_gstring GString *s = NULL; + char first[INET_ADDRSTRLEN]; + char last[INET_ADDRSTRLEN]; + char listen_address_s[INET_ADDRSTRLEN]; + char tmpaddr[INET_ADDRSTRLEN]; + gs_free char * error_desc = NULL; + const char * dm_binary; + const NMPlatformIP4Address * listen_address; + guint i, n; + + listen_address = nm_ip4_config_get_first_address(ip4_config); + + g_return_val_if_fail(listen_address, NULL); + + dm_binary = nm_utils_find_helper("dnsmasq", DNSMASQ_PATH, error); + if (!dm_binary) + return NULL; + + cmd = g_ptr_array_new_with_free_func(g_free); + + nm_strv_ptrarray_add_string_dup(cmd, dm_binary); + + if (nm_logging_enabled(LOGL_TRACE, LOGD_SHARING) || getenv("NM_DNSMASQ_DEBUG")) { + nm_strv_ptrarray_add_string_dup(cmd, "--log-dhcp"); + nm_strv_ptrarray_add_string_dup(cmd, "--log-queries"); + } + + /* dnsmasq may read from its default config file location, which if that + * location is a valid config file, it will combine with the options here + * and cause undesirable side-effects. Like sending bogus IP addresses + * as the gateway or whatever. So tell dnsmasq not to use any config file + * at all. + */ + nm_strv_ptrarray_add_string_dup(cmd, "--conf-file=/dev/null"); + + nm_strv_ptrarray_add_string_dup(cmd, "--no-hosts"); + nm_strv_ptrarray_add_string_dup(cmd, "--keep-in-foreground"); + nm_strv_ptrarray_add_string_dup(cmd, "--bind-interfaces"); + nm_strv_ptrarray_add_string_dup(cmd, "--except-interface=lo"); + nm_strv_ptrarray_add_string_dup(cmd, "--clear-on-reload"); + + /* Use strict order since in the case of VPN connections, the VPN's + * nameservers will be first in resolv.conf, and those need to be tried + * first by dnsmasq to successfully resolve names from the VPN. + */ + nm_strv_ptrarray_add_string_dup(cmd, "--strict-order"); + + _nm_utils_inet4_ntop(listen_address->address, listen_address_s); + + nm_strv_ptrarray_add_string_concat(cmd, "--listen-address=", listen_address_s); + + if (!nm_dnsmasq_utils_get_range(listen_address, first, last, &error_desc)) { + g_set_error_literal(error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_FAILED, error_desc); + _LOGW("failed to find DHCP address ranges: %s", error_desc); + return NULL; + } + + nm_strv_ptrarray_add_string_printf(cmd, "--dhcp-range=%s,%s,60m", first, last); + + if (nm_ip4_config_best_default_route_get(ip4_config)) { + nm_strv_ptrarray_add_string_concat(cmd, "--dhcp-option=option:router,", listen_address_s); + } + + if ((n = nm_ip4_config_get_num_nameservers(ip4_config))) { + nm_gstring_prepare(&s); + g_string_append(s, "--dhcp-option=option:dns-server"); + for (i = 0; i < n; i++) { + g_string_append_c(s, ','); + g_string_append( + s, + _nm_utils_inet4_ntop(nm_ip4_config_get_nameserver(ip4_config, i), tmpaddr)); + } + nm_strv_ptrarray_take_gstring(cmd, &s); + } + + if ((n = nm_ip4_config_get_num_searches(ip4_config))) { + nm_gstring_prepare(&s); + g_string_append(s, "--dhcp-option=option:domain-search"); + for (i = 0; i < n; i++) { + g_string_append_c(s, ','); + g_string_append(s, nm_ip4_config_get_search(ip4_config, i)); + } + nm_strv_ptrarray_take_gstring(cmd, &s); + } + + if (announce_android_metered) { + /* force option 43 to announce ANDROID_METERED. Do this, even if the client + * did not ask for this option. See https://www.lorier.net/docs/android-metered.html */ + nm_strv_ptrarray_add_string_dup(cmd, "--dhcp-option-force=43,ANDROID_METERED"); + } + + nm_strv_ptrarray_add_string_dup(cmd, "--dhcp-lease-max=50"); + + nm_strv_ptrarray_add_string_printf(cmd, + "--dhcp-leasefile=%s/dnsmasq-%s.leases", + NMSTATEDIR, + iface); + + nm_strv_ptrarray_add_string_concat(cmd, "--pid-file=", pidfile); + + /* dnsmasq exits if the conf dir is not present */ + if (g_file_test(CONFDIR, G_FILE_TEST_IS_DIR)) + nm_strv_ptrarray_add_string_dup(cmd, "--conf-dir=" CONFDIR); + + g_ptr_array_add(cmd, NULL); + return g_steal_pointer(&cmd); } static void -kill_existing_by_pidfile (const char *pidfile) +kill_existing_by_pidfile(const char *pidfile) { - char *contents = NULL; - pid_t pid; - char proc_path[250]; - char *cmdline_contents = NULL; - guint64 start_time; - const char *exe; - - if ( !pidfile - || !g_file_get_contents (pidfile, &contents, NULL, NULL)) - return; - - pid = _nm_utils_ascii_str_to_int64 (contents, 10, 1, G_MAXUINT64, 0); - if (pid == 0) - goto out; - - start_time = nm_utils_get_start_time_for_pid (pid, NULL, NULL); - if (start_time == 0) - goto out; - - nm_sprintf_buf (proc_path, "/proc/%lld/cmdline", (long long) pid); - if (!g_file_get_contents (proc_path, &cmdline_contents, NULL, NULL)) - goto out; - - exe = strrchr (cmdline_contents, '/'); - if ( (exe && strcmp (&exe[1], "dnsmasq") == 0) - || (strcmp (cmdline_contents, DNSMASQ_PATH) == 0)) { - nm_utils_kill_process_sync (pid, start_time, SIGKILL, LOGD_SHARING, - "dnsmasq", 0, 0, 500); - } + char * contents = NULL; + pid_t pid; + char proc_path[250]; + char * cmdline_contents = NULL; + guint64 start_time; + const char *exe; + + if (!pidfile || !g_file_get_contents(pidfile, &contents, NULL, NULL)) + return; + + pid = _nm_utils_ascii_str_to_int64(contents, 10, 1, G_MAXUINT64, 0); + if (pid == 0) + goto out; + + start_time = nm_utils_get_start_time_for_pid(pid, NULL, NULL); + if (start_time == 0) + goto out; + + nm_sprintf_buf(proc_path, "/proc/%lld/cmdline", (long long) pid); + if (!g_file_get_contents(proc_path, &cmdline_contents, NULL, NULL)) + goto out; + + exe = strrchr(cmdline_contents, '/'); + if ((exe && strcmp(&exe[1], "dnsmasq") == 0) || (strcmp(cmdline_contents, DNSMASQ_PATH) == 0)) { + nm_utils_kill_process_sync(pid, start_time, SIGKILL, LOGD_SHARING, "dnsmasq", 0, 0, 500); + } out: - unlink (pidfile); - g_free (cmdline_contents); - g_free (contents); + unlink(pidfile); + g_free(cmdline_contents); + g_free(contents); } gboolean -nm_dnsmasq_manager_start (NMDnsMasqManager *manager, - NMIP4Config *ip4_config, - gboolean announce_android_metered, - GError **error) +nm_dnsmasq_manager_start(NMDnsMasqManager *manager, + NMIP4Config * ip4_config, + gboolean announce_android_metered, + GError ** error) { - NMDnsMasqManagerPrivate *priv; - gs_unref_ptrarray GPtrArray *dm_cmd = NULL; - gs_free char *cmd_str = NULL; + NMDnsMasqManagerPrivate *priv; + gs_unref_ptrarray GPtrArray *dm_cmd = NULL; + gs_free char * cmd_str = NULL; - g_return_val_if_fail (NM_IS_DNSMASQ_MANAGER (manager), FALSE); - g_return_val_if_fail (!error || !*error, FALSE); - g_return_val_if_fail (nm_ip4_config_get_num_addresses (ip4_config) > 0, FALSE); + g_return_val_if_fail(NM_IS_DNSMASQ_MANAGER(manager), FALSE); + g_return_val_if_fail(!error || !*error, FALSE); + g_return_val_if_fail(nm_ip4_config_get_num_addresses(ip4_config) > 0, FALSE); - priv = NM_DNSMASQ_MANAGER_GET_PRIVATE (manager); + priv = NM_DNSMASQ_MANAGER_GET_PRIVATE(manager); - kill_existing_by_pidfile (priv->pidfile); + kill_existing_by_pidfile(priv->pidfile); - dm_cmd = create_dm_cmd_line (priv->iface, - ip4_config, - priv->pidfile, - announce_android_metered, - error); - if (!dm_cmd) - return FALSE; + dm_cmd = + create_dm_cmd_line(priv->iface, ip4_config, priv->pidfile, announce_android_metered, error); + if (!dm_cmd) + return FALSE; - _LOGI ("starting dnsmasq..."); - _LOGD ("command line: %s", (cmd_str = g_strjoinv (" ", (char **) dm_cmd->pdata))); + _LOGI("starting dnsmasq..."); + _LOGD("command line: %s", (cmd_str = g_strjoinv(" ", (char **) dm_cmd->pdata))); - priv->pid = 0; - if (!g_spawn_async (NULL, - (char **) dm_cmd->pdata, - NULL, - G_SPAWN_DO_NOT_REAP_CHILD, - nm_utils_setpgid, - NULL, - &priv->pid, - error)) - return FALSE; + priv->pid = 0; + if (!g_spawn_async(NULL, + (char **) dm_cmd->pdata, + NULL, + G_SPAWN_DO_NOT_REAP_CHILD, + nm_utils_setpgid, + NULL, + &priv->pid, + error)) + return FALSE; - nm_assert (priv->pid > 0); + nm_assert(priv->pid > 0); - _LOGD ("dnsmasq started with pid %d", priv->pid); + _LOGD("dnsmasq started with pid %d", priv->pid); - priv->dm_watch_id = g_child_watch_add (priv->pid, (GChildWatchFunc) dm_watch_cb, manager); + priv->dm_watch_id = g_child_watch_add(priv->pid, (GChildWatchFunc) dm_watch_cb, manager); - return TRUE; + return TRUE; } void -nm_dnsmasq_manager_stop (NMDnsMasqManager *manager) +nm_dnsmasq_manager_stop(NMDnsMasqManager *manager) { - NMDnsMasqManagerPrivate *priv; + NMDnsMasqManagerPrivate *priv; - g_return_if_fail (NM_IS_DNSMASQ_MANAGER (manager)); + g_return_if_fail(NM_IS_DNSMASQ_MANAGER(manager)); - priv = NM_DNSMASQ_MANAGER_GET_PRIVATE (manager); + priv = NM_DNSMASQ_MANAGER_GET_PRIVATE(manager); - nm_clear_g_source (&priv->dm_watch_id); + nm_clear_g_source(&priv->dm_watch_id); - if (priv->pid) { - nm_utils_kill_child_async (priv->pid, SIGTERM, LOGD_SHARING, "dnsmasq", 2000, NULL, NULL); - priv->pid = 0; - } + if (priv->pid) { + nm_utils_kill_child_async(priv->pid, SIGTERM, LOGD_SHARING, "dnsmasq", 2000, NULL, NULL); + priv->pid = 0; + } - unlink (priv->pidfile); + unlink(priv->pidfile); } /*****************************************************************************/ static void -nm_dnsmasq_manager_init (NMDnsMasqManager *manager) -{ -} +nm_dnsmasq_manager_init(NMDnsMasqManager *manager) +{} NMDnsMasqManager * -nm_dnsmasq_manager_new (const char *iface) +nm_dnsmasq_manager_new(const char *iface) { - NMDnsMasqManager *manager; - NMDnsMasqManagerPrivate *priv; + NMDnsMasqManager * manager; + NMDnsMasqManagerPrivate *priv; - manager = (NMDnsMasqManager *) g_object_new (NM_TYPE_DNSMASQ_MANAGER, NULL); + manager = (NMDnsMasqManager *) g_object_new(NM_TYPE_DNSMASQ_MANAGER, NULL); - priv = NM_DNSMASQ_MANAGER_GET_PRIVATE (manager); - priv->iface = g_strdup (iface); - priv->pidfile = g_strdup_printf (RUNSTATEDIR "/nm-dnsmasq-%s.pid", iface); + priv = NM_DNSMASQ_MANAGER_GET_PRIVATE(manager); + priv->iface = g_strdup(iface); + priv->pidfile = g_strdup_printf(RUNSTATEDIR "/nm-dnsmasq-%s.pid", iface); - return manager; + return manager; } static void -finalize (GObject *object) +finalize(GObject *object) { - NMDnsMasqManagerPrivate *priv = NM_DNSMASQ_MANAGER_GET_PRIVATE (object); + NMDnsMasqManagerPrivate *priv = NM_DNSMASQ_MANAGER_GET_PRIVATE(object); - nm_dnsmasq_manager_stop (NM_DNSMASQ_MANAGER (object)); + nm_dnsmasq_manager_stop(NM_DNSMASQ_MANAGER(object)); - g_free (priv->iface); - g_free (priv->pidfile); + g_free(priv->iface); + g_free(priv->pidfile); - G_OBJECT_CLASS (nm_dnsmasq_manager_parent_class)->finalize (object); + G_OBJECT_CLASS(nm_dnsmasq_manager_parent_class)->finalize(object); } static void -nm_dnsmasq_manager_class_init (NMDnsMasqManagerClass *manager_class) +nm_dnsmasq_manager_class_init(NMDnsMasqManagerClass *manager_class) { - GObjectClass *object_class = G_OBJECT_CLASS (manager_class); - - object_class->finalize = finalize; - - signals[STATE_CHANGED] = - g_signal_new (NM_DNS_MASQ_MANAGER_STATE_CHANGED, - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__UINT, - G_TYPE_NONE, 1, - G_TYPE_UINT); + GObjectClass *object_class = G_OBJECT_CLASS(manager_class); + + object_class->finalize = finalize; + + signals[STATE_CHANGED] = g_signal_new(NM_DNS_MASQ_MANAGER_STATE_CHANGED, + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_FIRST, + 0, + NULL, + NULL, + g_cclosure_marshal_VOID__UINT, + G_TYPE_NONE, + 1, + G_TYPE_UINT); } diff --git a/src/dnsmasq/nm-dnsmasq-manager.h b/src/dnsmasq/nm-dnsmasq-manager.h index 0a616b2a..4f8b3055 100644 --- a/src/dnsmasq/nm-dnsmasq-manager.h +++ b/src/dnsmasq/nm-dnsmasq-manager.h @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0+ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2008 Red Hat, Inc. */ @@ -8,34 +8,38 @@ #include "nm-ip4-config.h" -#define NM_TYPE_DNSMASQ_MANAGER (nm_dnsmasq_manager_get_type ()) -#define NM_DNSMASQ_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_DNSMASQ_MANAGER, NMDnsMasqManager)) -#define NM_DNSMASQ_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_DNSMASQ_MANAGER, NMDnsMasqManagerClass)) -#define NM_IS_DNSMASQ_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_DNSMASQ_MANAGER)) -#define NM_IS_DNSMASQ_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DNSMASQ_MANAGER)) -#define NM_DNSMASQ_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DNSMASQ_MANAGER, NMDnsMasqManagerClass)) +#define NM_TYPE_DNSMASQ_MANAGER (nm_dnsmasq_manager_get_type()) +#define NM_DNSMASQ_MANAGER(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj), NM_TYPE_DNSMASQ_MANAGER, NMDnsMasqManager)) +#define NM_DNSMASQ_MANAGER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), NM_TYPE_DNSMASQ_MANAGER, NMDnsMasqManagerClass)) +#define NM_IS_DNSMASQ_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), NM_TYPE_DNSMASQ_MANAGER)) +#define NM_IS_DNSMASQ_MANAGER_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), NM_TYPE_DNSMASQ_MANAGER)) +#define NM_DNSMASQ_MANAGER_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS((obj), NM_TYPE_DNSMASQ_MANAGER, NMDnsMasqManagerClass)) /* signals */ #define NM_DNS_MASQ_MANAGER_STATE_CHANGED "state-changed" typedef enum { - NM_DNSMASQ_STATUS_UNKNOWN, - NM_DNSMASQ_STATUS_DEAD, - NM_DNSMASQ_STATUS_RUNNING, + NM_DNSMASQ_STATUS_UNKNOWN, + NM_DNSMASQ_STATUS_DEAD, + NM_DNSMASQ_STATUS_RUNNING, } NMDnsMasqStatus; -typedef struct _NMDnsMasqManager NMDnsMasqManager; +typedef struct _NMDnsMasqManager NMDnsMasqManager; typedef struct _NMDnsMasqManagerClass NMDnsMasqManagerClass; -GType nm_dnsmasq_manager_get_type (void); +GType nm_dnsmasq_manager_get_type(void); -NMDnsMasqManager *nm_dnsmasq_manager_new (const char *iface); +NMDnsMasqManager *nm_dnsmasq_manager_new(const char *iface); -gboolean nm_dnsmasq_manager_start (NMDnsMasqManager *manager, - NMIP4Config *ip4_config, - gboolean announce_android_metered, - GError **error); +gboolean nm_dnsmasq_manager_start(NMDnsMasqManager *manager, + NMIP4Config * ip4_config, + gboolean announce_android_metered, + GError ** error); -void nm_dnsmasq_manager_stop (NMDnsMasqManager *manager); +void nm_dnsmasq_manager_stop(NMDnsMasqManager *manager); #endif /* __NETWORKMANAGER_DNSMASQ_MANAGER_H__ */ diff --git a/src/dnsmasq/nm-dnsmasq-utils.c b/src/dnsmasq/nm-dnsmasq-utils.c index 2373b422..3e430590 100644 --- a/src/dnsmasq/nm-dnsmasq-utils.c +++ b/src/dnsmasq/nm-dnsmasq-utils.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0+ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2013 Red Hat, Inc. */ @@ -12,91 +12,91 @@ #include "nm-utils.h" gboolean -nm_dnsmasq_utils_get_range (const NMPlatformIP4Address *addr, - char *out_first, - char *out_last, - char **out_error_desc) +nm_dnsmasq_utils_get_range(const NMPlatformIP4Address *addr, + char * out_first, + char * out_last, + char ** out_error_desc) { - guint32 host = addr->address; - guint8 prefix = addr->plen; - guint32 netmask; - guint32 first, last, mid, reserved; - const guint32 NUM = 256; + guint32 host = addr->address; + guint8 prefix = addr->plen; + guint32 netmask; + guint32 first, last, mid, reserved; + const guint32 NUM = 256; - g_return_val_if_fail (out_first, FALSE); - g_return_val_if_fail (out_last, FALSE); + g_return_val_if_fail(out_first, FALSE); + g_return_val_if_fail(out_last, FALSE); - if (prefix > 30) { - if (out_error_desc) - *out_error_desc = g_strdup_printf ("Address prefix %d is too small for DHCP.", prefix); - return FALSE; - } + if (prefix > 30) { + if (out_error_desc) + *out_error_desc = g_strdup_printf("Address prefix %d is too small for DHCP.", prefix); + return FALSE; + } - if (prefix < 24) { - /* if the subnet is larger then /24, we partition it and treat it - * like it would be a /24. - * - * Hence, the resulting range will always be between x.x.x.1/24 - * and x.x.x.254/24, with x.x.x.0 being the network address of the - * host. - * - * In this case, only a /24 portion of the subnet is used. - * No particular reason for that, but it's unlikely that a user - * would use NetworkManager's shared method when having hundered - * of DHCP clients. So, restrict the range to the same /24 in - * which the host address lies. - */ - prefix = 24; - } + if (prefix < 24) { + /* if the subnet is larger then /24, we partition it and treat it + * like it would be a /24. + * + * Hence, the resulting range will always be between x.x.x.1/24 + * and x.x.x.254/24, with x.x.x.0 being the network address of the + * host. + * + * In this case, only a /24 portion of the subnet is used. + * No particular reason for that, but it's unlikely that a user + * would use NetworkManager's shared method when having hundred + * of DHCP clients. So, restrict the range to the same /24 in + * which the host address lies. + */ + prefix = 24; + } - netmask = _nm_utils_ip4_prefix_to_netmask (prefix); + netmask = _nm_utils_ip4_prefix_to_netmask(prefix); - /* treat addresses in host-order from here on. */ - netmask = ntohl (netmask); - host = ntohl (host); + /* treat addresses in host-order from here on. */ + netmask = ntohl(netmask); + host = ntohl(host); - /* if host is the network or broadcast address, coerce it to - * one above or below. Usually, we wouldn't expect the user - * to pick such an address. */ - if (host == (host & netmask)) - host++; - else if (host == (host | ~netmask)) - host--; + /* if host is the network or broadcast address, coerce it to + * one above or below. Usually, we wouldn't expect the user + * to pick such an address. */ + if (host == (host & netmask)) + host++; + else if (host == (host | ~netmask)) + host--; - /* Exclude the network and broadcast address. */ - first = (host & netmask) + 1; - last = (host | ~netmask) - 1; + /* Exclude the network and broadcast address. */ + first = (host & netmask) + 1; + last = (host | ~netmask) - 1; - /* Depending on whether host is above or below the middle of - * the subnet, the larger part if handed out. - * - * If the host is in the lower half, the range starts - * at the lower end with the host (plus reserved), until the - * broadcast address - * - * If the host is in the upper half, the range starts above - * the network-address and goes up until the host (except reserved). - * - * reserved is up to 8 addresses, 10% of the determined range. - */ - mid = (host & netmask) | (((first + last) / 2) & ~netmask); - if (host > mid) { - /* use lower range */ - reserved = NM_MIN (((host - first) / 10), 8); - last = host - 1 - reserved; - first = NM_MAX (first, last > NUM ? last - NUM : 0); - } else { - /* use upper range */ - reserved = NM_MIN (((last - host) / 10), 8); - first = host + 1 + reserved; - last = NM_MIN (last, first < 0xFFFFFFFF - NUM ? first + NUM : 0xFFFFFFFF); - } + /* Depending on whether host is above or below the middle of + * the subnet, the larger part if handed out. + * + * If the host is in the lower half, the range starts + * at the lower end with the host (plus reserved), until the + * broadcast address + * + * If the host is in the upper half, the range starts above + * the network-address and goes up until the host (except reserved). + * + * reserved is up to 8 addresses, 10% of the determined range. + */ + mid = (host & netmask) | (((first + last) / 2) & ~netmask); + if (host > mid) { + /* use lower range */ + reserved = NM_MIN(((host - first) / 10), 8); + last = host - 1 - reserved; + first = NM_MAX(first, last > NUM ? last - NUM : 0); + } else { + /* use upper range */ + reserved = NM_MIN(((last - host) / 10), 8); + first = host + 1 + reserved; + last = NM_MIN(last, first < 0xFFFFFFFF - NUM ? first + NUM : 0xFFFFFFFF); + } - first = htonl (first); - last = htonl (last); + first = htonl(first); + last = htonl(last); - _nm_utils_inet4_ntop (first, out_first); - _nm_utils_inet4_ntop (last, out_last); + _nm_utils_inet4_ntop(first, out_first); + _nm_utils_inet4_ntop(last, out_last); - return TRUE; + return TRUE; } diff --git a/src/dnsmasq/nm-dnsmasq-utils.h b/src/dnsmasq/nm-dnsmasq-utils.h index a6a0342f..321035bd 100644 --- a/src/dnsmasq/nm-dnsmasq-utils.h +++ b/src/dnsmasq/nm-dnsmasq-utils.h @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0+ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2013 Red Hat, Inc. */ @@ -8,9 +8,9 @@ #include "platform/nm-platform.h" -gboolean nm_dnsmasq_utils_get_range (const NMPlatformIP4Address *addr, - char *out_first, - char *out_last, - char **out_error_desc); +gboolean nm_dnsmasq_utils_get_range(const NMPlatformIP4Address *addr, + char * out_first, + char * out_last, + char ** out_error_desc); #endif /* __NETWORKMANAGER_DNSMASQ_UTILS_H__ */ diff --git a/src/dnsmasq/tests/test-dnsmasq-utils.c b/src/dnsmasq/tests/test-dnsmasq-utils.c index 432a5727..4fa17576 100644 --- a/src/dnsmasq/tests/test-dnsmasq-utils.c +++ b/src/dnsmasq/tests/test-dnsmasq-utils.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0+ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2013 Red Hat, Inc. */ @@ -12,153 +12,163 @@ #include "nm-test-utils-core.h" static void -test_address_ranges (void) +test_address_ranges(void) { -#define _test_address_range(addr, plen, expected_first, expected_last) \ - G_STMT_START { \ - char *_error_desc = NULL; \ - char _first[INET_ADDRSTRLEN]; \ - char _last[INET_ADDRSTRLEN]; \ - \ - if (!nm_dnsmasq_utils_get_range (nmtst_platform_ip4_address ((addr""), NULL, (plen)), \ - _first, _last, &_error_desc)) \ - g_assert_not_reached (); \ - g_assert (!_error_desc); \ - g_assert_cmpstr (_first, ==, (expected_first"")); \ - g_assert_cmpstr (_last, ==, (expected_last"")); \ - g_assert_cmpint ((ntohl (nmtst_inet4_from_string (_last)) - ntohl (nmtst_inet4_from_string (_first))), <=, 244); \ - } G_STMT_END - -#define _test_address_range_fail(addr, plen) \ - G_STMT_START { \ - char *_error_desc = NULL; \ - char _first[INET_ADDRSTRLEN]; \ - char _last[INET_ADDRSTRLEN]; \ - \ - if (nm_dnsmasq_utils_get_range (nmtst_platform_ip4_address ((addr""), NULL, (plen)), \ - _first, _last, &_error_desc)) \ - g_assert_not_reached (); \ - g_assert (_error_desc); \ - g_free (_error_desc); \ - } G_STMT_END - - _test_address_range_fail ("1.2.3.1", 31); - - _test_address_range ("0.0.0.0", 30, "0.0.0.2", "0.0.0.2"); - _test_address_range ("0.0.0.1", 30, "0.0.0.2", "0.0.0.2"); - _test_address_range ("0.0.0.2", 30, "0.0.0.1", "0.0.0.1"); - _test_address_range ("0.0.0.3", 30, "0.0.0.1", "0.0.0.1"); - _test_address_range ("1.2.3.0", 30, "1.2.3.2", "1.2.3.2"); - _test_address_range ("1.2.3.1", 30, "1.2.3.2", "1.2.3.2"); - _test_address_range ("1.2.3.2", 30, "1.2.3.1", "1.2.3.1"); - _test_address_range ("1.2.3.3", 30, "1.2.3.1", "1.2.3.1"); - _test_address_range ("1.2.3.4", 30, "1.2.3.6", "1.2.3.6"); - _test_address_range ("1.2.3.5", 30, "1.2.3.6", "1.2.3.6"); - _test_address_range ("1.2.3.6", 30, "1.2.3.5", "1.2.3.5"); - _test_address_range ("1.2.3.7", 30, "1.2.3.5", "1.2.3.5"); - _test_address_range ("1.2.3.8", 30, "1.2.3.10", "1.2.3.10"); - _test_address_range ("1.2.3.9", 30, "1.2.3.10", "1.2.3.10"); - _test_address_range ("255.255.255.0", 30, "255.255.255.2", "255.255.255.2"); - _test_address_range ("255.255.255.1", 30, "255.255.255.2", "255.255.255.2"); - _test_address_range ("255.255.255.2", 30, "255.255.255.1", "255.255.255.1"); - _test_address_range ("255.255.255.3", 30, "255.255.255.1", "255.255.255.1"); - _test_address_range ("255.255.255.248", 30, "255.255.255.250", "255.255.255.250"); - _test_address_range ("255.255.255.249", 30, "255.255.255.250", "255.255.255.250"); - _test_address_range ("255.255.255.250", 30, "255.255.255.249", "255.255.255.249"); - _test_address_range ("255.255.255.251", 30, "255.255.255.249", "255.255.255.249"); - _test_address_range ("255.255.255.252", 30, "255.255.255.254", "255.255.255.254"); - _test_address_range ("255.255.255.253", 30, "255.255.255.254", "255.255.255.254"); - _test_address_range ("255.255.255.254", 30, "255.255.255.253", "255.255.255.253"); - _test_address_range ("255.255.255.255", 30, "255.255.255.253", "255.255.255.253"); - - _test_address_range ("0.0.0.0", 29, "0.0.0.2", "0.0.0.6"); - _test_address_range ("0.0.0.1", 29, "0.0.0.2", "0.0.0.6"); - _test_address_range ("0.0.0.2", 29, "0.0.0.3", "0.0.0.6"); - _test_address_range ("0.0.0.3", 29, "0.0.0.4", "0.0.0.6"); - _test_address_range ("0.0.0.4", 29, "0.0.0.1", "0.0.0.3"); - _test_address_range ("0.0.0.5", 29, "0.0.0.1", "0.0.0.4"); - _test_address_range ("0.0.0.6", 29, "0.0.0.1", "0.0.0.5"); - _test_address_range ("0.0.0.7", 29, "0.0.0.1", "0.0.0.5"); - _test_address_range ("0.0.0.8", 29, "0.0.0.10", "0.0.0.14"); - _test_address_range ("0.0.0.9", 29, "0.0.0.10", "0.0.0.14"); - _test_address_range ("1.2.3.0", 29, "1.2.3.2", "1.2.3.6"); - _test_address_range ("1.2.3.1", 29, "1.2.3.2", "1.2.3.6"); - _test_address_range ("1.2.3.2", 29, "1.2.3.3", "1.2.3.6"); - _test_address_range ("1.2.3.3", 29, "1.2.3.4", "1.2.3.6"); - _test_address_range ("1.2.3.4", 29, "1.2.3.1", "1.2.3.3"); - _test_address_range ("1.2.3.5", 29, "1.2.3.1", "1.2.3.4"); - _test_address_range ("1.2.3.6", 29, "1.2.3.1", "1.2.3.5"); - _test_address_range ("1.2.3.7", 29, "1.2.3.1", "1.2.3.5"); - _test_address_range ("1.2.3.8", 29, "1.2.3.10", "1.2.3.14"); - _test_address_range ("1.2.3.9", 29, "1.2.3.10", "1.2.3.14"); - _test_address_range ("255.255.255.248", 29, "255.255.255.250", "255.255.255.254"); - _test_address_range ("255.255.255.249", 29, "255.255.255.250", "255.255.255.254"); - _test_address_range ("255.255.255.250", 29, "255.255.255.251", "255.255.255.254"); - _test_address_range ("255.255.255.251", 29, "255.255.255.252", "255.255.255.254"); - _test_address_range ("255.255.255.252", 29, "255.255.255.249", "255.255.255.251"); - _test_address_range ("255.255.255.253", 29, "255.255.255.249", "255.255.255.252"); - _test_address_range ("255.255.255.254", 29, "255.255.255.249", "255.255.255.253"); - _test_address_range ("255.255.255.255", 29, "255.255.255.249", "255.255.255.253"); - - _test_address_range ("1.2.3.1", 29, "1.2.3.2", "1.2.3.6"); - _test_address_range ("1.2.3.1", 28, "1.2.3.3", "1.2.3.14"); - _test_address_range ("1.2.3.1", 26, "1.2.3.8", "1.2.3.62"); - - _test_address_range ("192.167.255.255", 24, "192.167.255.1", "192.167.255.245"); - _test_address_range ("192.168.0.0", 24, "192.168.0.10", "192.168.0.254"); - _test_address_range ("192.168.0.1", 24, "192.168.0.10", "192.168.0.254"); - _test_address_range ("192.168.0.2", 24, "192.168.0.11", "192.168.0.254"); - _test_address_range ("192.168.0.99", 24, "192.168.0.108", "192.168.0.254"); - _test_address_range ("192.168.0.126", 24, "192.168.0.135", "192.168.0.254"); - _test_address_range ("192.168.0.127", 24, "192.168.0.136", "192.168.0.254"); - _test_address_range ("192.168.0.128", 24, "192.168.0.1", "192.168.0.119"); - _test_address_range ("192.168.0.129", 24, "192.168.0.1", "192.168.0.120"); - _test_address_range ("192.168.0.130", 24, "192.168.0.1", "192.168.0.121"); - _test_address_range ("192.168.0.254", 24, "192.168.0.1", "192.168.0.245"); - _test_address_range ("192.168.0.255", 24, "192.168.0.1", "192.168.0.245"); - _test_address_range ("192.168.1.0", 24, "192.168.1.10", "192.168.1.254"); - _test_address_range ("192.168.1.1", 24, "192.168.1.10", "192.168.1.254"); - _test_address_range ("192.168.1.2", 24, "192.168.1.11", "192.168.1.254"); - _test_address_range ("192.168.1.10", 24, "192.168.1.19", "192.168.1.254"); - _test_address_range ("192.168.15.253", 24, "192.168.15.1", "192.168.15.244"); - _test_address_range ("192.168.15.254", 24, "192.168.15.1", "192.168.15.245"); - _test_address_range ("192.168.15.255", 24, "192.168.15.1", "192.168.15.245"); - _test_address_range ("192.168.16.0", 24, "192.168.16.10", "192.168.16.254"); - _test_address_range ("192.168.16.1", 24, "192.168.16.10", "192.168.16.254"); - - _test_address_range ("192.167.255.255", 20, "192.167.255.1", "192.167.255.245"); - _test_address_range ("192.168.0.0", 20, "192.168.0.10", "192.168.0.254"); - _test_address_range ("192.168.0.1", 20, "192.168.0.10", "192.168.0.254"); - _test_address_range ("192.168.0.2", 20, "192.168.0.11", "192.168.0.254"); - _test_address_range ("192.168.0.126", 20, "192.168.0.135", "192.168.0.254"); - _test_address_range ("192.168.0.127", 20, "192.168.0.136", "192.168.0.254"); - _test_address_range ("192.168.0.128", 20, "192.168.0.1", "192.168.0.119"); - _test_address_range ("192.168.0.129", 20, "192.168.0.1", "192.168.0.120"); - _test_address_range ("192.168.0.130", 20, "192.168.0.1", "192.168.0.121"); - _test_address_range ("192.168.0.254", 20, "192.168.0.1", "192.168.0.245"); - _test_address_range ("192.168.0.255", 20, "192.168.0.1", "192.168.0.245"); - _test_address_range ("192.168.1.0", 20, "192.168.1.10", "192.168.1.254"); - _test_address_range ("192.168.1.1", 20, "192.168.1.10", "192.168.1.254"); - _test_address_range ("192.168.1.2", 20, "192.168.1.11", "192.168.1.254"); - _test_address_range ("192.168.1.10", 20, "192.168.1.19", "192.168.1.254"); - _test_address_range ("192.168.15.253", 20, "192.168.15.1", "192.168.15.244"); - _test_address_range ("192.168.15.254", 20, "192.168.15.1", "192.168.15.245"); - _test_address_range ("192.168.15.255", 20, "192.168.15.1", "192.168.15.245"); - _test_address_range ("192.168.16.0", 20, "192.168.16.10", "192.168.16.254"); - _test_address_range ("192.168.16.1", 20, "192.168.16.10", "192.168.16.254"); +#define _test_address_range(addr, plen, expected_first, expected_last) \ + G_STMT_START \ + { \ + char *_error_desc = NULL; \ + char _first[INET_ADDRSTRLEN]; \ + char _last[INET_ADDRSTRLEN]; \ + \ + if (!nm_dnsmasq_utils_get_range(nmtst_platform_ip4_address((addr ""), NULL, (plen)), \ + _first, \ + _last, \ + &_error_desc)) \ + g_assert_not_reached(); \ + g_assert(!_error_desc); \ + g_assert_cmpstr(_first, ==, (expected_first "")); \ + g_assert_cmpstr(_last, ==, (expected_last "")); \ + g_assert_cmpint( \ + (ntohl(nmtst_inet4_from_string(_last)) - ntohl(nmtst_inet4_from_string(_first))), \ + <=, \ + 244); \ + } \ + G_STMT_END + +#define _test_address_range_fail(addr, plen) \ + G_STMT_START \ + { \ + char *_error_desc = NULL; \ + char _first[INET_ADDRSTRLEN]; \ + char _last[INET_ADDRSTRLEN]; \ + \ + if (nm_dnsmasq_utils_get_range(nmtst_platform_ip4_address((addr ""), NULL, (plen)), \ + _first, \ + _last, \ + &_error_desc)) \ + g_assert_not_reached(); \ + g_assert(_error_desc); \ + g_free(_error_desc); \ + } \ + G_STMT_END + + _test_address_range_fail("1.2.3.1", 31); + + _test_address_range("0.0.0.0", 30, "0.0.0.2", "0.0.0.2"); + _test_address_range("0.0.0.1", 30, "0.0.0.2", "0.0.0.2"); + _test_address_range("0.0.0.2", 30, "0.0.0.1", "0.0.0.1"); + _test_address_range("0.0.0.3", 30, "0.0.0.1", "0.0.0.1"); + _test_address_range("1.2.3.0", 30, "1.2.3.2", "1.2.3.2"); + _test_address_range("1.2.3.1", 30, "1.2.3.2", "1.2.3.2"); + _test_address_range("1.2.3.2", 30, "1.2.3.1", "1.2.3.1"); + _test_address_range("1.2.3.3", 30, "1.2.3.1", "1.2.3.1"); + _test_address_range("1.2.3.4", 30, "1.2.3.6", "1.2.3.6"); + _test_address_range("1.2.3.5", 30, "1.2.3.6", "1.2.3.6"); + _test_address_range("1.2.3.6", 30, "1.2.3.5", "1.2.3.5"); + _test_address_range("1.2.3.7", 30, "1.2.3.5", "1.2.3.5"); + _test_address_range("1.2.3.8", 30, "1.2.3.10", "1.2.3.10"); + _test_address_range("1.2.3.9", 30, "1.2.3.10", "1.2.3.10"); + _test_address_range("255.255.255.0", 30, "255.255.255.2", "255.255.255.2"); + _test_address_range("255.255.255.1", 30, "255.255.255.2", "255.255.255.2"); + _test_address_range("255.255.255.2", 30, "255.255.255.1", "255.255.255.1"); + _test_address_range("255.255.255.3", 30, "255.255.255.1", "255.255.255.1"); + _test_address_range("255.255.255.248", 30, "255.255.255.250", "255.255.255.250"); + _test_address_range("255.255.255.249", 30, "255.255.255.250", "255.255.255.250"); + _test_address_range("255.255.255.250", 30, "255.255.255.249", "255.255.255.249"); + _test_address_range("255.255.255.251", 30, "255.255.255.249", "255.255.255.249"); + _test_address_range("255.255.255.252", 30, "255.255.255.254", "255.255.255.254"); + _test_address_range("255.255.255.253", 30, "255.255.255.254", "255.255.255.254"); + _test_address_range("255.255.255.254", 30, "255.255.255.253", "255.255.255.253"); + _test_address_range("255.255.255.255", 30, "255.255.255.253", "255.255.255.253"); + + _test_address_range("0.0.0.0", 29, "0.0.0.2", "0.0.0.6"); + _test_address_range("0.0.0.1", 29, "0.0.0.2", "0.0.0.6"); + _test_address_range("0.0.0.2", 29, "0.0.0.3", "0.0.0.6"); + _test_address_range("0.0.0.3", 29, "0.0.0.4", "0.0.0.6"); + _test_address_range("0.0.0.4", 29, "0.0.0.1", "0.0.0.3"); + _test_address_range("0.0.0.5", 29, "0.0.0.1", "0.0.0.4"); + _test_address_range("0.0.0.6", 29, "0.0.0.1", "0.0.0.5"); + _test_address_range("0.0.0.7", 29, "0.0.0.1", "0.0.0.5"); + _test_address_range("0.0.0.8", 29, "0.0.0.10", "0.0.0.14"); + _test_address_range("0.0.0.9", 29, "0.0.0.10", "0.0.0.14"); + _test_address_range("1.2.3.0", 29, "1.2.3.2", "1.2.3.6"); + _test_address_range("1.2.3.1", 29, "1.2.3.2", "1.2.3.6"); + _test_address_range("1.2.3.2", 29, "1.2.3.3", "1.2.3.6"); + _test_address_range("1.2.3.3", 29, "1.2.3.4", "1.2.3.6"); + _test_address_range("1.2.3.4", 29, "1.2.3.1", "1.2.3.3"); + _test_address_range("1.2.3.5", 29, "1.2.3.1", "1.2.3.4"); + _test_address_range("1.2.3.6", 29, "1.2.3.1", "1.2.3.5"); + _test_address_range("1.2.3.7", 29, "1.2.3.1", "1.2.3.5"); + _test_address_range("1.2.3.8", 29, "1.2.3.10", "1.2.3.14"); + _test_address_range("1.2.3.9", 29, "1.2.3.10", "1.2.3.14"); + _test_address_range("255.255.255.248", 29, "255.255.255.250", "255.255.255.254"); + _test_address_range("255.255.255.249", 29, "255.255.255.250", "255.255.255.254"); + _test_address_range("255.255.255.250", 29, "255.255.255.251", "255.255.255.254"); + _test_address_range("255.255.255.251", 29, "255.255.255.252", "255.255.255.254"); + _test_address_range("255.255.255.252", 29, "255.255.255.249", "255.255.255.251"); + _test_address_range("255.255.255.253", 29, "255.255.255.249", "255.255.255.252"); + _test_address_range("255.255.255.254", 29, "255.255.255.249", "255.255.255.253"); + _test_address_range("255.255.255.255", 29, "255.255.255.249", "255.255.255.253"); + + _test_address_range("1.2.3.1", 29, "1.2.3.2", "1.2.3.6"); + _test_address_range("1.2.3.1", 28, "1.2.3.3", "1.2.3.14"); + _test_address_range("1.2.3.1", 26, "1.2.3.8", "1.2.3.62"); + + _test_address_range("192.167.255.255", 24, "192.167.255.1", "192.167.255.245"); + _test_address_range("192.168.0.0", 24, "192.168.0.10", "192.168.0.254"); + _test_address_range("192.168.0.1", 24, "192.168.0.10", "192.168.0.254"); + _test_address_range("192.168.0.2", 24, "192.168.0.11", "192.168.0.254"); + _test_address_range("192.168.0.99", 24, "192.168.0.108", "192.168.0.254"); + _test_address_range("192.168.0.126", 24, "192.168.0.135", "192.168.0.254"); + _test_address_range("192.168.0.127", 24, "192.168.0.136", "192.168.0.254"); + _test_address_range("192.168.0.128", 24, "192.168.0.1", "192.168.0.119"); + _test_address_range("192.168.0.129", 24, "192.168.0.1", "192.168.0.120"); + _test_address_range("192.168.0.130", 24, "192.168.0.1", "192.168.0.121"); + _test_address_range("192.168.0.254", 24, "192.168.0.1", "192.168.0.245"); + _test_address_range("192.168.0.255", 24, "192.168.0.1", "192.168.0.245"); + _test_address_range("192.168.1.0", 24, "192.168.1.10", "192.168.1.254"); + _test_address_range("192.168.1.1", 24, "192.168.1.10", "192.168.1.254"); + _test_address_range("192.168.1.2", 24, "192.168.1.11", "192.168.1.254"); + _test_address_range("192.168.1.10", 24, "192.168.1.19", "192.168.1.254"); + _test_address_range("192.168.15.253", 24, "192.168.15.1", "192.168.15.244"); + _test_address_range("192.168.15.254", 24, "192.168.15.1", "192.168.15.245"); + _test_address_range("192.168.15.255", 24, "192.168.15.1", "192.168.15.245"); + _test_address_range("192.168.16.0", 24, "192.168.16.10", "192.168.16.254"); + _test_address_range("192.168.16.1", 24, "192.168.16.10", "192.168.16.254"); + + _test_address_range("192.167.255.255", 20, "192.167.255.1", "192.167.255.245"); + _test_address_range("192.168.0.0", 20, "192.168.0.10", "192.168.0.254"); + _test_address_range("192.168.0.1", 20, "192.168.0.10", "192.168.0.254"); + _test_address_range("192.168.0.2", 20, "192.168.0.11", "192.168.0.254"); + _test_address_range("192.168.0.126", 20, "192.168.0.135", "192.168.0.254"); + _test_address_range("192.168.0.127", 20, "192.168.0.136", "192.168.0.254"); + _test_address_range("192.168.0.128", 20, "192.168.0.1", "192.168.0.119"); + _test_address_range("192.168.0.129", 20, "192.168.0.1", "192.168.0.120"); + _test_address_range("192.168.0.130", 20, "192.168.0.1", "192.168.0.121"); + _test_address_range("192.168.0.254", 20, "192.168.0.1", "192.168.0.245"); + _test_address_range("192.168.0.255", 20, "192.168.0.1", "192.168.0.245"); + _test_address_range("192.168.1.0", 20, "192.168.1.10", "192.168.1.254"); + _test_address_range("192.168.1.1", 20, "192.168.1.10", "192.168.1.254"); + _test_address_range("192.168.1.2", 20, "192.168.1.11", "192.168.1.254"); + _test_address_range("192.168.1.10", 20, "192.168.1.19", "192.168.1.254"); + _test_address_range("192.168.15.253", 20, "192.168.15.1", "192.168.15.244"); + _test_address_range("192.168.15.254", 20, "192.168.15.1", "192.168.15.245"); + _test_address_range("192.168.15.255", 20, "192.168.15.1", "192.168.15.245"); + _test_address_range("192.168.16.0", 20, "192.168.16.10", "192.168.16.254"); + _test_address_range("192.168.16.1", 20, "192.168.16.10", "192.168.16.254"); } /*****************************************************************************/ -NMTST_DEFINE (); +NMTST_DEFINE(); int -main (int argc, char **argv) +main(int argc, char **argv) { - nmtst_init_assert_logging (&argc, &argv, "INFO", "DEFAULT"); + nmtst_init_assert_logging(&argc, &argv, "INFO", "DEFAULT"); - g_test_add_func ("/dnsmasq/address-ranges", test_address_ranges); + g_test_add_func("/dnsmasq/address-ranges", test_address_ranges); - return g_test_run (); + return g_test_run(); } - |