diff -Naur dnsmasq-2.89-orig/Makefile dnsmasq-2.89-new/Makefile
--- dnsmasq-2.89-orig/Makefile	2023-09-02 03:18:17.572326793 +0000
+++ dnsmasq-2.89-new/Makefile	2023-09-02 03:16:58.048718284 +0000
@@ -85,7 +85,8 @@
        dhcp-common.o outpacket.o radv.o slaac.o auth.o ipset.o pattern.o \
        domain.o dnssec.o blockdata.o tables.o loop.o inotify.o \
        poll.o rrfilter.o edns0.o arp.o crypto.o dump.o ubus.o \
-       metrics.o hash-questions.o domain-match.o nftset.o
+       metrics.o hash-questions.o domain-match.o nftset.o \
+       dnsmasq_dbus.o dnsmasq_marshal.o
 
 hdrs = dnsmasq.h config.h dhcp-protocol.h dhcp6-protocol.h \
        dns-protocol.h radv-protocol.h ip6addr.h metrics.h
@@ -166,7 +167,7 @@
 $(objs): $(copts_conf) $(hdrs)
 
 .c.o:
-	$(CC) -I$(top)/../../../ooma/dbus_headers/ -I$(top)/../../../staging_dir/target-arm-none-linux-gnueabi/usr/lib/glib-2.0/include $(CFLAGS) $(COPTS) $(DBUS_MINOR) $(i18n) $(DBUS_CFLAGS) $(build_cflags) $(RPM_OPT_FLAGS) -c $<	 
+	$(CC) -I$(TOPDIR)/staging_dir/target-arm-none-linux-gnueabi/usr/lib/glib-2.0/include -I$(TOPDIR)/ooma/dbus_headers/ $(CFLAGS) $(COPTS) $(DBUS_MINOR) $(i18n) $(DBUS_CFLAGS) $(build_cflags) $(RPM_OPT_FLAGS) -c $<
 
 dnsmasq : $(objs)
 	$(CC) $(LDFLAGS) -o $@ $(objs) $(build_libs) $(LIBS) 
diff -Naur dnsmasq-2.89-orig/Makefile.orig dnsmasq-2.89-new/Makefile.orig
--- dnsmasq-2.89-orig/Makefile.orig	2023-02-02 20:24:24.000000000 +0000
+++ dnsmasq-2.89-new/Makefile.orig	1970-01-01 00:00:00.000000000 +0000
@@ -1,179 +0,0 @@
-# dnsmasq is Copyright (c) 2000-2022 Simon Kelley
-#
-#  This program is free software; you can redistribute it and/or modify
-#  it under the terms of the GNU General Public License as published by
-#  the Free Software Foundation; version 2 dated June, 1991, or
-#  (at your option) version 3 dated 29 June, 2007.
-#
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#  GNU General Public License for more details.
-#    
-#  You should have received a copy of the GNU General Public License
-#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-# NOTE: Building the i18n targets requires GNU-make 
-
-
-# Variables you may well want to override.
-
-PREFIX        = /usr/local
-BINDIR        = $(PREFIX)/sbin
-MANDIR        = $(PREFIX)/share/man
-LOCALEDIR     = $(PREFIX)/share/locale
-BUILDDIR      = $(SRC)
-DESTDIR       = 
-CFLAGS        = -Wall -W -O2
-LDFLAGS       = 
-COPTS         = 
-RPM_OPT_FLAGS = 
-LIBS          = 
-
-#################################################################
-
-# Variables you might want to override.
-
-PKG_CONFIG = pkg-config
-INSTALL    = install
-MSGMERGE   = msgmerge
-MSGFMT     = msgfmt
-XGETTEXT   = xgettext
-
-SRC = src
-PO  = po
-MAN = man
-
-#################################################################
-
-# pmake way. (NB no spaces to keep gmake 3.82 happy)
-top!=pwd
-# GNU make way.
-top?=$(CURDIR)
-
-dbus_cflags =   `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DBUS $(PKG_CONFIG) --cflags dbus-1` 
-dbus_libs =     `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DBUS $(PKG_CONFIG) --libs dbus-1` 
-ubus_libs =     `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_UBUS "" --copy '-lubox -lubus'`
-idn_cflags =    `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_IDN $(PKG_CONFIG) --cflags libidn` 
-idn_libs =      `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_IDN $(PKG_CONFIG) --libs libidn` 
-idn2_cflags =   `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LIBIDN2 $(PKG_CONFIG) --cflags libidn2`
-idn2_libs =     `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LIBIDN2 $(PKG_CONFIG) --libs libidn2`
-ct_cflags =     `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_CONNTRACK $(PKG_CONFIG) --cflags libnetfilter_conntrack`
-ct_libs =       `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_CONNTRACK $(PKG_CONFIG) --libs libnetfilter_conntrack`
-lua_cflags =    `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LUASCRIPT $(PKG_CONFIG) --cflags lua5.2` 
-lua_libs =      `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_LUASCRIPT $(PKG_CONFIG) --libs lua5.2` 
-nettle_cflags = `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DNSSEC     $(PKG_CONFIG) --cflags 'nettle hogweed' \
-                                                        HAVE_CRYPTOHASH $(PKG_CONFIG) --cflags nettle \
-                                                        HAVE_NETTLEHASH $(PKG_CONFIG) --cflags nettle`
-nettle_libs =   `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DNSSEC     $(PKG_CONFIG) --libs 'nettle hogweed' \
-                                                        HAVE_CRYPTOHASH $(PKG_CONFIG) --libs nettle \
-                                                        HAVE_NETTLEHASH $(PKG_CONFIG) --libs nettle`
-gmp_libs =      `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_DNSSEC NO_GMP --copy -lgmp`
-sunos_libs =    `if uname | grep SunOS >/dev/null 2>&1; then echo -lsocket -lnsl -lposix4; fi`
-nft_cflags =    `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_NFTSET $(PKG_CONFIG) --cflags libnftables` 
-nft_libs =      `echo $(COPTS) | $(top)/bld/pkg-wrapper HAVE_NFTSET $(PKG_CONFIG) --libs libnftables`
-version =       -DVERSION='\"`$(top)/bld/get-version $(top)`\"'
-
-sum?=$(shell $(CC) -DDNSMASQ_COMPILE_OPTS $(COPTS) -E $(top)/$(SRC)/dnsmasq.h | ( md5sum 2>/dev/null || md5 ) | cut -f 1 -d ' ')
-sum!=$(CC) -DDNSMASQ_COMPILE_OPTS $(COPTS) -E $(top)/$(SRC)/dnsmasq.h | ( md5sum 2>/dev/null || md5 ) | cut -f 1 -d ' '
-copts_conf = .copts_$(sum)
-
-objs = cache.o rfc1035.o util.o option.o forward.o network.o \
-       dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o \
-       helper.o tftp.o log.o conntrack.o dhcp6.o rfc3315.o \
-       dhcp-common.o outpacket.o radv.o slaac.o auth.o ipset.o pattern.o \
-       domain.o dnssec.o blockdata.o tables.o loop.o inotify.o \
-       poll.o rrfilter.o edns0.o arp.o crypto.o dump.o ubus.o \
-       metrics.o hash-questions.o domain-match.o nftset.o
-
-hdrs = dnsmasq.h config.h dhcp-protocol.h dhcp6-protocol.h \
-       dns-protocol.h radv-protocol.h ip6addr.h metrics.h
-
-all : $(BUILDDIR)
-	@cd $(BUILDDIR) && $(MAKE) \
- top="$(top)" \
- build_cflags="$(version) $(dbus_cflags) $(idn2_cflags) $(idn_cflags) $(ct_cflags) $(lua_cflags) $(nettle_cflags) $(nft_cflags)" \
- build_libs="$(dbus_libs) $(idn2_libs) $(idn_libs) $(ct_libs) $(lua_libs) $(sunos_libs) $(nettle_libs) $(gmp_libs) $(ubus_libs) $(nft_libs)" \
- -f $(top)/Makefile dnsmasq 
-
-mostly_clean :
-	rm -f $(BUILDDIR)/*.mo $(BUILDDIR)/*.pot 
-	rm -f $(BUILDDIR)/.copts_* $(BUILDDIR)/*.o $(BUILDDIR)/dnsmasq.a $(BUILDDIR)/dnsmasq
-
-clean : mostly_clean
-	rm -f $(BUILDDIR)/dnsmasq_baseline
-	rm -f core */core
-	rm -f *~ contrib/*/*~ */*~
-
-install : all install-common
-
-install-common :
-	$(INSTALL) -d $(DESTDIR)$(BINDIR)
-	$(INSTALL) -d $(DESTDIR)$(MANDIR)/man8
-	$(INSTALL) -m 644 $(MAN)/dnsmasq.8 $(DESTDIR)$(MANDIR)/man8 
-	$(INSTALL) -m 755 $(BUILDDIR)/dnsmasq $(DESTDIR)$(BINDIR)
-
-all-i18n : $(BUILDDIR)
-	@cd $(BUILDDIR) && $(MAKE) \
- top="$(top)" \
- i18n=-DLOCALEDIR=\'\"$(LOCALEDIR)\"\' \
- build_cflags="$(version) $(dbus_cflags) $(idn2_cflags) $(idn_cflags) $(ct_cflags) $(lua_cflags) $(nettle_cflags) $(nft_cflags)" \
- build_libs="$(dbus_libs) $(idn2_libs) $(idn_libs) $(ct_libs) $(lua_libs) $(sunos_libs) $(nettle_libs) $(gmp_libs) $(ubus_libs) $(nft_libs)"  \
- -f $(top)/Makefile dnsmasq
-	for f in `cd $(PO); echo *.po`; do \
-		cd $(top) && cd $(BUILDDIR) && $(MAKE) top="$(top)" -f $(top)/Makefile $${f%.po}.mo; \
-	done
-
-install-i18n : all-i18n install-common
-	cd $(BUILDDIR); $(top)/bld/install-mo $(DESTDIR)$(LOCALEDIR) $(INSTALL)
-	cd $(MAN); ../bld/install-man $(DESTDIR)$(MANDIR) $(INSTALL)
-
-merge : 
-	@cd $(BUILDDIR) && $(MAKE) top="$(top)" -f $(top)/Makefile dnsmasq.pot
-	for f in `cd $(PO); echo *.po`; do \
-		echo -n msgmerge $(PO)/$$f && $(MSGMERGE) --no-wrap -U $(PO)/$$f $(BUILDDIR)/dnsmasq.pot; \
-	done
-
-# Canonicalise .po file.
-%.po : 
-	@cd $(BUILDDIR) && $(MAKE) -f $(top)/Makefile dnsmasq.pot
-	mv $(PO)/$*.po $(PO)/$*.po.orig && $(MSGMERGE) --no-wrap $(PO)/$*.po.orig $(BUILDDIR)/dnsmasq.pot >$(PO)/$*.po; 
-
-$(BUILDDIR):
-	mkdir -p $(BUILDDIR)
-
-# rules below are helpers for size tracking
-
-baseline : mostly_clean all
-	@cd $(BUILDDIR) && \
-	   mv dnsmasq dnsmasq_baseline
-
-bloatcheck : $(BUILDDIR)/dnsmasq_baseline mostly_clean all
-	@cd $(BUILDDIR) && \
-           $(top)/bld/bloat-o-meter dnsmasq_baseline dnsmasq; \
-           size dnsmasq_baseline dnsmasq
-
-# rules below are targets in recursive makes with cwd=$(BUILDDIR)
-
-$(copts_conf): $(hdrs)
-	@rm -f *.o .copts_*
-	@touch $@
-
-$(objs:.o=.c) $(hdrs):
-	ln -s $(top)/$(SRC)/$@ .
-
-$(objs): $(copts_conf) $(hdrs)
-
-.c.o:
-	$(CC) $(CFLAGS) $(COPTS) $(i18n) $(build_cflags) $(RPM_OPT_FLAGS) -c $<	
-
-dnsmasq : $(objs)
-	$(CC) $(LDFLAGS) -o $@ $(objs) $(build_libs) $(LIBS) 
-
-dnsmasq.pot : $(objs:.o=.c) $(hdrs)
-	$(XGETTEXT) -d dnsmasq --foreign-user --omit-header --keyword=_ -o $@ -i $(objs:.o=.c)
-
-%.mo : $(top)/$(PO)/%.po dnsmasq.pot
-	$(MSGMERGE) -o - $(top)/$(PO)/$*.po dnsmasq.pot | $(MSGFMT) -o $*.mo -
-
-.PHONY : all clean mostly_clean install install-common all-i18n install-i18n merge baseline bloatcheck
diff -Naur dnsmasq-2.89-orig/src/config.h dnsmasq-2.89-new/src/config.h
--- dnsmasq-2.89-orig/src/config.h	2023-02-02 20:24:24.000000000 +0000
+++ dnsmasq-2.89-new/src/config.h	2023-09-02 03:15:42.437089988 +0000
@@ -14,6 +14,7 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#define NO_IPV6
 #define FTABSIZ 150 /* max number of outstanding requests (default) */
 #define MAX_PROCS 20 /* max no children for TCP requests */
 #define CHILD_LIFETIME 150 /* secs 'till terminated (RFC1035 suggests > 120s) */
diff -Naur dnsmasq-2.89-orig/src/dnsmasq.c dnsmasq-2.89-new/src/dnsmasq.c
--- dnsmasq-2.89-orig/src/dnsmasq.c	2023-02-02 20:24:24.000000000 +0000
+++ dnsmasq-2.89-new/src/dnsmasq.c	2023-09-02 03:15:42.437089988 +0000
@@ -26,6 +26,7 @@
 
 struct daemon *daemon;
 
+
 static volatile pid_t pid = 0;
 static volatile int pipewrite;
 
@@ -37,6 +38,45 @@
 static int read_event(int fd, struct event_desc *evp, char **msg);
 static void poll_resolv(int force, int do_reload, time_t now);
 
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+
+/* return 0 iff tun0 is up */
+static int tunnel_is_up(const char *if_name)
+{
+    int sock;
+    struct ifreq ifr;
+    int rc = -1;
+
+    /* open a socket */
+    sock = socket(AF_INET, SOCK_DGRAM, 0);
+
+    if(sock != -1)
+    {
+        /* get the status of the interface */
+        strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
+        if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0)
+            rc = -1;
+        else
+        {
+            if((ifr.ifr_flags & IFF_UP) && (ifr.ifr_flags & IFF_RUNNING))
+            {
+                rc = 0;
+            }
+            else
+            {
+                /* tun0 is down */
+                rc = 1;
+            }
+        }
+        close(sock);
+    }
+    return rc;
+}
+
+#include "dnsmasq_dbus.h"
+
 int main (int argc, char **argv)
 {
   time_t now;
diff -Naur dnsmasq-2.89-orig/src/dnsmasq_dbus.c dnsmasq-2.89-new/src/dnsmasq_dbus.c
--- dnsmasq-2.89-orig/src/dnsmasq_dbus.c	1970-01-01 00:00:00.000000000 +0000
+++ dnsmasq-2.89-new/src/dnsmasq_dbus.c	2023-09-02 03:15:42.437089988 +0000
@@ -0,0 +1,165 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+#include <dbus/dbus-glib.h>
+
+#include <ooma/util.h>
+#include "dnsmasq_dbus_server_stub.h" // auto generated stub
+#include "dnsmasq_dbus_headers.h"
+#include "dnsmasq_marshal.h" // header for manually generated marshaller for needed data structure
+#include "msglib/msglib.h"
+
+
+typedef enum {
+  E_DNSMASQ_SIG1,
+  E_SIGNAL_COUNT  
+} SigNum;
+
+typedef struct {
+  GObject parent; 
+} SigObject;
+
+/** TO DO  MAKE IT STATIC TO RESTRICT SCOPE TO THIS FILE **/
+SigObject *dnsmasqObj = NULL; 
+
+typedef struct {
+  GObjectClass parent;
+  guint signals[E_SIGNAL_COUNT];  
+} SigObjectClass;
+
+GType sig_object_get_type(void);
+
+#define SIG_TYPE_OBJECT              (sig_object_get_type())
+
+
+#define SIG_OBJECT_GET_CLASS(obj) \
+        (G_TYPE_INSTANCE_GET_CLASS ((obj), \
+         SIG_TYPE_OBJECT, SigObjectClass))
+
+G_DEFINE_TYPE(SigObject, sig_object, G_TYPE_OBJECT)
+
+static void sig_object_init(SigObject* obj) {
+  g_assert(obj != NULL);
+}
+
+
+static void sig_object_class_init(SigObjectClass* klass) 
+{
+	const gchar* signalNames[E_SIGNAL_COUNT] = {DNSMASQ_SIG1};
+	g_assert(klass != NULL);
+
+    guint signalId;
+	
+	signalId = g_signal_new(signalNames[0], G_OBJECT_CLASS_TYPE(klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_user_marshal_VOID__LONG_LONG_UCHAR_STRING, G_TYPE_NONE, 4,G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UCHAR, G_TYPE_STRING);
+	klass->signals[0] = signalId;
+
+	dbus_g_object_register_marshaller(g_cclosure_user_marshal_VOID__LONG_LONG_UCHAR_STRING, G_TYPE_NONE,G_TYPE_UINT,G_TYPE_UINT, G_TYPE_UCHAR, G_TYPE_STRING, G_TYPE_INVALID);
+	dbus_g_object_type_install_info(SIG_TYPE_OBJECT,&dbus_glib_dnsmasq_object_info);
+
+}
+
+static void handleError(const char* msg, const char* reason,
+                                         gboolean fatal) {
+  //g_printerr("ERROR: %s (%s)\n", msg, reason);
+  char *tmp;
+  tmp = (char *)malloc(strlen(msg)+1+strlen("message_log dnsmasq ERROR ")+1);
+  strcpy(tmp,"message_log dnsmasq ERROR ");
+  strcat(tmp,msg);
+  writelog(tmp,101);
+  free(tmp);
+
+  if (fatal) {
+    exit(EXIT_FAILURE);
+  }
+}
+
+/**
+ * dbus_init - Dbus initialization code. Connects to the dbus, registers well known service with dbus, registers object with dbus
+ */
+void ooma_dbus_init()
+{
+	static int flag=0;
+
+	/** To ensure that initialization occurs only once **/
+	if (1==flag)
+		return;
+	flag=1;
+	/****************************************************/
+
+	DBusGConnection* bus = NULL;
+	DBusGProxy* busProxy = NULL;
+	GMainLoop* mainloop = NULL;
+	guint result;
+	GError* error = NULL;
+	g_type_init();
+
+	mainloop = g_main_loop_new(NULL, FALSE);
+	if (mainloop == NULL) {
+    	handleError("Couldn't create GMainLoop", "Unknown(OOM?)", TRUE);
+	}
+
+	bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
+	if (error != NULL) {
+    	handleError("Couldn't connect to system bus", error->message, TRUE);
+	}
+
+	busProxy = dbus_g_proxy_new_for_name(bus,DBUS_SERVICE_DBUS,DBUS_PATH_DBUS,DBUS_INTERFACE_DBUS);
+	if (busProxy == NULL) {
+    	handleError("Failed to get a proxy for D-Bus","Unknown(dbus_g_proxy_new_for_name)", TRUE);
+	}
+
+
+    if (!dbus_g_proxy_call(busProxy, "RequestName", &error, G_TYPE_STRING,DNSMASQ_SERVICE_NAME, G_TYPE_UINT, 0, G_TYPE_INVALID, G_TYPE_UINT, &result, G_TYPE_INVALID))
+    {
+    	handleError("D-Bus.RequestName RPC failed", error->message,TRUE);
+    }
+
+    if (result != 1)
+    {       handleError("Failed to get the primary well-known name.","RequestName result != 1", TRUE);
+    }
+
+    	dnsmasqObj = g_object_new(SIG_TYPE_OBJECT, NULL);
+    
+    if (dnsmasqObj == NULL)
+    {
+    	handleError("Failed to create one Sig instance.","Unknown(OOM?)", TRUE);
+    }
+
+    dbus_g_connection_register_g_object(bus, DNSMASQ_SERVICE_OBJECT_PATH, G_OBJECT(dnsmasqObj));
+	writelog("message_log dnsmasq dbus init successful",100);
+}
+
+
+/**
+ * emit_ooma_msgbuf_t_signal -  emits signal with arguments as members of ooma_msgbuf_t structure
+ */
+static void emit_ooma_msgbuf_t_signal(SigNum num,long mtype, long msg_length, char nv_count, char *mtext)
+{
+        SigObjectClass* klass = SIG_OBJECT_GET_CLASS(dnsmasqObj);
+        g_assert((num < E_SIGNAL_COUNT) && (num >= 0));
+        g_signal_emit(dnsmasqObj, klass->signals[num], 0, mtype,msg_length,nv_count,mtext);
+}
+
+/**
+ * send_ooma_msgbuf_t -  This function is called from application in order to send message to other applications. It internally calls msglib functionality with callback to actually fire signal
+ * code, nv_pairs, nv_count: params to be sent
+ * TO DO: Replicate 'ooma_msgbus_t' structure in all the applications, declare it locally, fill up in in msglib and fire directly thereby avoiding a callback!!
+ */
+int send_ooma_msgbuf(ulong code, char **nv_pairs, ulong nv_count)
+{
+    ooma_msgbuf_t       msgbuf;
+    /*  ooma_msg_send_with_dbus is in libmsg.so */
+	ooma_msg_err_t retval = ooma_msg_send_with_dbus(code, nv_pairs, nv_count, &msgbuf);
+	if ( 0 == retval)
+	{
+		emit_ooma_msgbuf_t_signal(E_DNSMASQ_SIG1,msgbuf.mtype,msgbuf.msg_length,msgbuf.nv_count,msgbuf.mtext);
+		return OOMA_MSG_SUCCESS;
+	}
+	else
+		return retval;
+}
+
+
+
+
diff -Naur dnsmasq-2.89-orig/src/dnsmasq_dbus.h dnsmasq-2.89-new/src/dnsmasq_dbus.h
--- dnsmasq-2.89-orig/src/dnsmasq_dbus.h	1970-01-01 00:00:00.000000000 +0000
+++ dnsmasq-2.89-new/src/dnsmasq_dbus.h	2023-09-02 03:15:42.437089988 +0000
@@ -0,0 +1,6 @@
+#ifndef _DNSMASQ_DBUS_
+#define _DNSMASQ_DBUS_
+void ooma_dbus_init();
+int send_ooma_msgbuf(ulong, char **, ulong );
+#endif
+
diff -Naur dnsmasq-2.89-orig/src/dnsmasq_dbus_server_stub.h dnsmasq-2.89-new/src/dnsmasq_dbus_server_stub.h
--- dnsmasq-2.89-orig/src/dnsmasq_dbus_server_stub.h	1970-01-01 00:00:00.000000000 +0000
+++ dnsmasq-2.89-new/src/dnsmasq_dbus_server_stub.h	2023-09-02 03:15:42.437089988 +0000
@@ -0,0 +1,72 @@
+/* Generated by dbus-binding-tool; do not edit! */
+
+
+#ifndef __dbus_glib_marshal_dnsmasq_MARSHAL_H__
+#define __dbus_glib_marshal_dnsmasq_MARSHAL_H__
+
+#include	<glib-object.h>
+
+G_BEGIN_DECLS
+
+#ifdef G_ENABLE_DEBUG
+#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
+#define g_marshal_value_peek_char(v)     g_value_get_char (v)
+#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
+#define g_marshal_value_peek_int(v)      g_value_get_int (v)
+#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
+#define g_marshal_value_peek_long(v)     g_value_get_long (v)
+#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)
+#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)
+#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)
+#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
+#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
+#define g_marshal_value_peek_float(v)    g_value_get_float (v)
+#define g_marshal_value_peek_double(v)   g_value_get_double (v)
+#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)
+#define g_marshal_value_peek_param(v)    g_value_get_param (v)
+#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)
+#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)
+#define g_marshal_value_peek_object(v)   g_value_get_object (v)
+#else /* !G_ENABLE_DEBUG */
+/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
+ *          Do not access GValues directly in your code. Instead, use the
+ *          g_value_get_*() functions
+ */
+#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int
+#define g_marshal_value_peek_char(v)     (v)->data[0].v_int
+#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint
+#define g_marshal_value_peek_int(v)      (v)->data[0].v_int
+#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint
+#define g_marshal_value_peek_long(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64
+#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64
+#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_float(v)    (v)->data[0].v_float
+#define g_marshal_value_peek_double(v)   (v)->data[0].v_double
+#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer
+#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer
+#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer
+#endif /* !G_ENABLE_DEBUG */
+
+
+G_END_DECLS
+
+#endif /* __dbus_glib_marshal_dnsmasq_MARSHAL_H__ */
+
+#include <dbus/dbus-glib.h>
+static const DBusGMethodInfo dbus_glib_dnsmasq_methods[] = {
+};
+
+const DBusGObjectInfo dbus_glib_dnsmasq_object_info = {
+  0,
+  dbus_glib_dnsmasq_methods,
+  0,
+"\0",
+"org.ooma.dnsmasqiface\0dnsmasq_sig1\0org.ooma.dnsmasqiface\0dnsmasq_param_update_sig\0\0",
+"\0"
+};
+
diff -Naur dnsmasq-2.89-orig/src/dnsmasq_marshal.c dnsmasq-2.89-new/src/dnsmasq_marshal.c
--- dnsmasq-2.89-orig/src/dnsmasq_marshal.c	1970-01-01 00:00:00.000000000 +0000
+++ dnsmasq-2.89-new/src/dnsmasq_marshal.c	2023-09-02 03:15:42.437089988 +0000
@@ -0,0 +1,127 @@
+
+#include	<glib-object.h>
+
+
+#ifdef G_ENABLE_DEBUG
+#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
+#define g_marshal_value_peek_char(v)     g_value_get_char (v)
+#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
+#define g_marshal_value_peek_int(v)      g_value_get_int (v)
+#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
+#define g_marshal_value_peek_long(v)     g_value_get_long (v)
+#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)
+#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)
+#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)
+#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
+#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
+#define g_marshal_value_peek_float(v)    g_value_get_float (v)
+#define g_marshal_value_peek_double(v)   g_value_get_double (v)
+#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)
+#define g_marshal_value_peek_param(v)    g_value_get_param (v)
+#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)
+#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)
+#define g_marshal_value_peek_object(v)   g_value_get_object (v)
+#else /* !G_ENABLE_DEBUG */
+/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
+ *          Do not access GValues directly in your code. Instead, use the
+ *          g_value_get_*() functions
+ */
+#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int
+#define g_marshal_value_peek_char(v)     (v)->data[0].v_int
+#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint
+#define g_marshal_value_peek_int(v)      (v)->data[0].v_int
+#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint
+#define g_marshal_value_peek_long(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64
+#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64
+#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_float(v)    (v)->data[0].v_float
+#define g_marshal_value_peek_double(v)   (v)->data[0].v_double
+#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer
+#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer
+#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer
+#endif /* !G_ENABLE_DEBUG */
+
+
+/* VOID:LONG,LONG,UCHAR,STRING (dnsmasq-gen-marshal-input.file:1) */
+void
+g_cclosure_user_marshal_VOID__LONG_LONG_UCHAR_STRING (GClosure     *closure,
+                                                      GValue       *return_value,
+                                                      guint         n_param_values,
+                                                      const GValue *param_values,
+                                                      gpointer      invocation_hint,
+                                                      gpointer      marshal_data)
+{
+  typedef void (*GMarshalFunc_VOID__LONG_LONG_UCHAR_STRING) (gpointer     data1,
+                                                             glong        arg_1,
+                                                             glong        arg_2,
+                                                             guchar       arg_3,
+                                                             gpointer     arg_4,
+                                                             gpointer     data2);
+  register GMarshalFunc_VOID__LONG_LONG_UCHAR_STRING callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+
+  g_return_if_fail (n_param_values == 5);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_VOID__LONG_LONG_UCHAR_STRING) (marshal_data ? marshal_data : cc->callback);
+
+  callback (data1,
+            g_marshal_value_peek_long (param_values + 1),
+            g_marshal_value_peek_long (param_values + 2),
+            g_marshal_value_peek_uchar (param_values + 3),
+            g_marshal_value_peek_string (param_values + 4),
+            data2);
+}
+
+/* VOID:LONG,UCHAR (dnsmasq-gen-marshal-input.file:2) */
+void
+g_cclosure_user_marshal_VOID__LONG_UCHAR (GClosure     *closure,
+                                          GValue       *return_value,
+                                          guint         n_param_values,
+                                          const GValue *param_values,
+                                          gpointer      invocation_hint,
+                                          gpointer      marshal_data)
+{
+  typedef void (*GMarshalFunc_VOID__LONG_UCHAR) (gpointer     data1,
+                                                 glong        arg_1,
+                                                 guchar       arg_2,
+                                                 gpointer     data2);
+  register GMarshalFunc_VOID__LONG_UCHAR callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+
+  g_return_if_fail (n_param_values == 3);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_VOID__LONG_UCHAR) (marshal_data ? marshal_data : cc->callback);
+
+  callback (data1,
+            g_marshal_value_peek_long (param_values + 1),
+            g_marshal_value_peek_uchar (param_values + 2),
+            data2);
+}
+
diff -Naur dnsmasq-2.89-orig/src/dnsmasq_marshal.h dnsmasq-2.89-new/src/dnsmasq_marshal.h
--- dnsmasq-2.89-orig/src/dnsmasq_marshal.h	1970-01-01 00:00:00.000000000 +0000
+++ dnsmasq-2.89-new/src/dnsmasq_marshal.h	2023-09-02 03:15:42.437089988 +0000
@@ -0,0 +1,28 @@
+
+#ifndef __g_cclosure_user_marshal_MARSHAL_H__
+#define __g_cclosure_user_marshal_MARSHAL_H__
+
+#include	<glib-object.h>
+
+G_BEGIN_DECLS
+
+/* VOID:LONG,LONG,UCHAR,STRING (dnsmasq-gen-marshal-input.file:1) */
+extern void g_cclosure_user_marshal_VOID__LONG_LONG_UCHAR_STRING (GClosure     *closure,
+                                                                  GValue       *return_value,
+                                                                  guint         n_param_values,
+                                                                  const GValue *param_values,
+                                                                  gpointer      invocation_hint,
+                                                                  gpointer      marshal_data);
+
+/* VOID:LONG,UCHAR (dnsmasq-gen-marshal-input.file:2) */
+extern void g_cclosure_user_marshal_VOID__LONG_UCHAR (GClosure     *closure,
+                                                      GValue       *return_value,
+                                                      guint         n_param_values,
+                                                      const GValue *param_values,
+                                                      gpointer      invocation_hint,
+                                                      gpointer      marshal_data);
+
+G_END_DECLS
+
+#endif /* __g_cclosure_user_marshal_MARSHAL_H__ */
+
diff -Naur dnsmasq-2.89-orig/src/lease.c dnsmasq-2.89-new/src/lease.c
--- dnsmasq-2.89-orig/src/lease.c	2023-02-02 20:24:24.000000000 +0000
+++ dnsmasq-2.89-new/src/lease.c	2023-09-02 03:15:42.437089988 +0000
@@ -579,8 +579,44 @@
 	up = &lease->next;
     }
 } 
-	
-  
+
+/*
+ * ooma_send_mac_to_netmgr
+ *
+ * Send a message to netmgr
+ */
+#include "msglib/msglib.h"
+
+#include "dnsmasq_dbus.h"
+
+static void
+ooma_send_mac_to_netmgr (struct dhcp_lease *lease)
+{
+    static int           init = 0;
+    static char          *nv_pairs[2];
+    static char          nv_values[2][30];
+
+    if (!lease) {
+       fprintf(stderr, "Null lease pointer\n");
+       return;
+    }
+
+    if (!init) {
+        sprintf(nv_values[0], "type:mac");
+        nv_pairs[0] = nv_values[0];
+        nv_pairs[1] = nv_values[1];
+        init = 1;
+    }
+
+    sprintf(nv_values[1], "mac:%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
+            lease->hwaddr[0], lease->hwaddr[1], lease->hwaddr[2],
+            lease->hwaddr[3], lease->hwaddr[4], lease->hwaddr[5]);
+
+	ooma_dbus_init();
+	send_ooma_msgbuf( 1, nv_pairs, 2);
+    my_syslog(LOG_INFO, _("dnsmasq lease.c sent over dbus"));
+}
+
 struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type,
 					unsigned char *clid, int clid_len)
 {
@@ -884,6 +920,7 @@
       lease->hwaddr_type = hw_type;
       lease->flags |= LEASE_CHANGED;
       file_dirty = 1; /* run script on change */
+      ooma_send_mac_to_netmgr(lease);
     }
 
   /* only update clid when one is available, stops packets
