Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Jun 2007 11:37:16 GMT
From:      Fredrik Lindberg <fli@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 122028 for review
Message-ID:  <200706201137.l5KBbGo8051406@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=122028

Change 122028 by fli@fli_genesis on 2007/06/20 11:36:30

	- Use one global cache cleaner instead of one per interface.
	- Add some __unused to silence compiler.
	- Some variable renaming to avoid function shadowing.
	- Remove unnecessary error logging. 
	- Add record database init/destroy calls.
	- Make the routing socket event read until there is no data left.
	- Revisit how interface address changes are handled.
	- Insert a just-to-be-sure setlocale() call.

Affected files ...

.. //depot/projects/soc2007/fli-mdns_sd/mdnsd/mdnsd.c#3 edit

Differences ...

==== //depot/projects/soc2007/fli-mdns_sd/mdnsd/mdnsd.c#3 (text+ko) ====

@@ -34,7 +34,9 @@
 #include <arpa/inet.h>
 
 #include <err.h>
+#include <fcntl.h>
 #include <ifaddrs.h>
+#include <locale.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <signal.h>
@@ -115,14 +117,19 @@
  * Periodic cache cleaner, removes expired cache entries
  */
 static int
-evh_cacheclean(const struct event_tmr *ev, const ev_arg arg)
+evh_cacheclean(const struct event_tmr *ev __unused, const ev_arg arg)
 {
-	struct md_if *mif = arg.ptr;
+	struct md_glob *g = arg.ptr;
+	struct md_if *mif;
 
-	if (if_aquire(mif, 1) != 0)
-		return (0);
-	cache_clean(&mif->mif_cache);	
-	if_release(mif, 1);
+	RW_RLOCK(g, g_lock);
+	TAILQ_FOREACH(mif, &g->g_ifs, mif_next) {
+		if (if_aquire(mif, 1) != 0)
+			continue;
+		cache_clean(&mif->mif_cache);	
+		if_release(mif, 1);
+	}
+	RW_UNLOCK(g, g_lock);
 	return (0);
 }
 
@@ -132,7 +139,7 @@
  * occured, this is to catch and ignore sporadic link changes.
  */
 static int
-evh_linkchg(const struct event_tmr *ev, const ev_arg arg)
+evh_linkchg(const struct event_tmr *ev __unused, const ev_arg arg)
 {
 	struct md_if *mif = arg.ptr;
 
@@ -159,7 +166,7 @@
  * Signal handler to SIG{INT,HUP}
  */
 int
-sig(struct event_sig *ev, ev_arg arg)
+sig(struct event_sig *ev, ev_arg arg __unused)
 {
 
 	dprintf(DEBUG_MISC, "Signal %d caught\n", ev->evsig_signo);
@@ -171,7 +178,7 @@
  * Signal handler initializer for SIG{INT,HUP}
  */
 int
-sig_init(int what, struct event_sig *ev, ev_arg arg)
+sig_init(int what __unused, struct event_sig *ev, ev_arg arg __unused)
 {
 
 	ev->evsig_signo = arg.int32;
@@ -488,7 +495,7 @@
 }
 
 static inline int
-if_aquire(struct md_if *mif, int write)
+if_aquire(struct md_if *mif, int w)
 {
 
 	RW_WLOCK(mif, mif_lock);
@@ -497,7 +504,7 @@
 		return (-1);;
 	}
 	mif->mif_refcnt++;
-	if (!write) {
+	if (!w) {
 		RW_UNLOCK(mif, mif_lock);
 		RW_RLOCK(mif, mif_lock);
 	}
@@ -505,10 +512,10 @@
 }
 
 static inline void
-if_release(struct md_if *mif, int write)
+if_release(struct md_if *mif, int w)
 {
 
-	if (!write) {
+	if (!w) {
 		RW_UNLOCK(mif, mif_lock);
 		RW_WLOCK(mif, mif_lock);
 	}
@@ -544,11 +551,11 @@
 	eva.ptr = mif;
 	/* Open up UDP and TCP INET sockets */
 	error = mdns_open(&mif->mif_handle, MDNS_UDP, PF_INET);
-	if (error != 0)
-		logger(LOG_ERR, "Failed to setup multicast UDP sockets (INET)");
+	if (error == 0)
+		mif->mif_flags |= MIF_UDP4;
 	error = mdns_open(&mif->mif_handle, MDNS_TCP, PF_INET);
-	if (error != 0)
-		logger(LOG_ERR, "Failed to setup TCP sockets (INET)");
+	if (error == 0)
+		mif->mif_flags |= MIF_TCP4;
 
 	/* Install read-ready event to UDP INET socket */
 	socks = mdns_get_sock(&mif->mif_handle, MDNS_UDP, PF_INET, &socklen);    	
@@ -583,11 +590,11 @@
 #ifdef INET6
 	/* Open up UDP and TCP INET6 sockets */
 	error = mdns_open(&mif->mif_handle, MDNS_UDP, PF_INET6);
-	if (error != 0)
-		logger(LOG_ERR, "Failed to setup multicast UDP sockets (INET6)");
+	if (error == 0)
+		mif->mif_flags |= MIF_UDP6;
 	error = mdns_open(&mif->mif_handle, MDNS_TCP, PF_INET6);
-	if (error != 0)
-		logger(LOG_ERR, "Failed to setup TCP sockets (INET6)");
+	if (error == 0)
+		mif->mif_flags |= MIF_TCP6;
 
 	/* Install read-ready event to UDP INET6 socket */
 	socks = mdns_get_sock(&mif->mif_handle, MDNS_UDP, PF_INET6, &socklen);    	
@@ -681,17 +688,22 @@
 	RW_WLOCK(mif, mif_lock);
 	mif->mif_glob = g;
 	TAILQ_INIT(&mif->mif_evlist);
+	
 	cache_init(&mif->mif_cache);
-	mif->mif_cache.c_timer = tmr_start(g, 1000, evh_cacheclean, mif);
+
 	if (get_linkstatus(ifnam) != LINK_STATE_DOWN)
 		mif->mif_flags |= MIF_LINKUP;
 	setup_socks(mif);
+
 	MDNS_INIT_SET(mif, mif_magic);
-	RW_UNLOCK(mif, mif_lock);
+	dbr_init(&mif->mif_dbr, mif);
+	cfg_read(&mif->mif_dbr, ifnam, "mdnsd.conf");
 
 	RW_WLOCK(g, g_lock);
 	TAILQ_INSERT_TAIL(&g->g_ifs, mif, mif_next);
 	RW_UNLOCK(g, g_lock);
+
+	RW_UNLOCK(mif, mif_lock);
 	logger(LOG_NOTICE, "Added interface %s", mif->mif_ifnam);
 
 	return (mif);
@@ -722,10 +734,10 @@
 		event_del(g->g_evl, ifev->ifev_id, NULL);
 		free(ifev);
 	}
-	tmr_stop(g, mif->mif_cache.c_timer);
 
 	mdns_destroy(&mif->mif_handle);
 	cache_destroy(&mif->mif_cache);
+	dbr_destroy(&mif->mif_dbr);
 
 	logger(LOG_NOTICE, "Removed interface %s", mif->mif_ifnam);
 	if_release(mif, 1);
@@ -733,12 +745,12 @@
 }
 
 static struct md_if *
-if_indextodata(struct md_glob *g, int index)
+if_indextodata(struct md_glob *g, int idx)
 {
 	struct md_if *mif;
 
 	TAILQ_FOREACH(mif, &g->g_ifs, mif_next) {
-		if (index == mif->mif_index)
+		if (idx == mif->mif_index)
 			return (mif);
 	}
 	return (NULL);
@@ -748,15 +760,16 @@
  * Routing socket event handler initialization
  */
 int
-evh_routesock_init(int what, struct event_io *ev, ev_arg arg)
+evh_routesock_init(int what, struct event_io *ev, ev_arg arg __unused)
 {
 	int sock;
 
 	switch (what) {
 	case EVENT_INIT_OPEN:
-		sock = socket(AF_ROUTE, SOCK_RAW, 0);
+		sock = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
 		if (sock < 0)
 			return (-1);
+		fcntl(sock, F_SETFL, O_NONBLOCK);
 		ev->evio_fd = sock;
 		ev->evio_dir = EVENT_IO_READ;
 		break;
@@ -786,70 +799,73 @@
 
 	sock = ev->evio_fd;
 
-	len = read(sock, buf, RS_BUFLEN);
-	if (len <= 0)
-		return (0);
+	for (;;) {
+		len = read(sock, buf, RS_BUFLEN);
+		if (len <= 0)
+			break;
+		lim = buf + len;
+		for (next = buf; next < lim; next += ifm->ifm_msglen) {
+			ifm = (struct if_msghdr *) next;
+			if (ifm->ifm_flags & IFF_LOOPBACK)
+				continue;
 
-	lim = buf + len;
-	for (next = buf; next < lim; next += ifm->ifm_msglen) {
-		ifm = (struct if_msghdr *) next;
-		if (ifm->ifm_flags & IFF_LOOPBACK)
-			continue;
+			RW_RLOCK(g, g_lock);
+			mif = if_indextodata(g, ifm->ifm_index);
+			RW_UNLOCK(g, g_lock);
 
-		RW_RLOCK(g, g_lock);
-		mif = if_indextodata(g, ifm->ifm_index);
-		RW_UNLOCK(g, g_lock);
+			if (ifm->ifm_type == RTM_IFINFO) {
+				if (ifm->ifm_flags & IFF_UP && mif == NULL) {
+					if (ifm->ifm_flags & IFF_MULTICAST)
+						if (if_indextoname(ifm->ifm_index, ifnam) != NULL)
+							if_new(g, ifnam);
+				}
+				else if (!(ifm->ifm_flags & IFF_UP) && mif != NULL) {
+					if_del(g, mif);
+				}
+				else {
+					if (if_aquire(mif, 1) != 0)
+						continue;
 
-		if (ifm->ifm_type == RTM_IFINFO) {
-			if (ifm->ifm_flags & IFF_UP && mif == NULL) {
-				if (ifm->ifm_flags & IFF_MULTICAST)
-					if (if_indextoname(ifm->ifm_index, ifnam) != NULL)
-						if_new(g, ifnam);
+					if (mif->mif_flags & MIF_LINKCHG) {
+						tmr_stop(g, mif->mif_tmr);
+						mif->mif_flags &= ~MIF_LINKCHG;
+						dprintf(DEBUG_MISC,
+					        "Link on %s re-restored, ignoring state change",
+					        mif->mif_ifnam);
+					}
+					else if ((ifm->ifm_data.ifi_link_state == LINK_STATE_UP &&
+				    	!(mif->mif_flags & MIF_LINKUP)) ||
+				    	(ifm->ifm_data.ifi_link_state == LINK_STATE_DOWN &&
+				    	mif->mif_flags & MIF_LINKUP)) {
+						mif->mif_flags |= MIF_LINKCHG;
+						mif->mif_tmr = tmr_start(g, 3000, evh_linkchg, mif);
+					}
+					if_release(mif, 1);
+				}
 			}
-			else if (!(ifm->ifm_flags & IFF_UP) && mif != NULL) {
-				if_del(g, mif);
-			}
-			else {
-				if (if_aquire(mif, 1) != 0)
-					continue;
 
-				if (mif->mif_flags & MIF_LINKCHG) {
-					tmr_stop(g, mif->mif_tmr);
-					mif->mif_flags &= ~MIF_LINKCHG;
-					dprintf(DEBUG_MISC,
-					    "Link on %s re-restored, ignoring state change",
-					    mif->mif_ifnam);
-				}
-				else if ((ifm->ifm_data.ifi_link_state == LINK_STATE_UP &&
-				    !(mif->mif_flags & MIF_LINKUP)) ||
-				    (ifm->ifm_data.ifi_link_state == LINK_STATE_DOWN &&
-				    mif->mif_flags & MIF_LINKUP)) {
-					mif->mif_flags |= MIF_LINKCHG;
-					mif->mif_tmr = tmr_start(g, 3000, evh_linkchg, mif);
-				}
-
-				if_release(mif, 1);
+			if (mif == NULL) {
+				continue;
 			}
-		}
-		else if (mif == NULL) {
-			continue;
-		}
 
-		/* This is a bit crude */
-		if (ifm->ifm_type == RTM_NEWADDR || ifm->ifm_type == RTM_DELADDR ||
-			ifm->ifm_type == RTM_NEWMADDR) {
 			if_aquire(mif, 1);
-			TAILQ_FOREACH_SAFE(ifev, &mif->mif_evlist, ifev_next, ifev2) {
-				event_del(g->g_evl, ifev->ifev_id, NULL);
-				free(ifev);
-			}
-			mdns_close(&mif->mif_handle, MDNS_UDP, PF_INET);
-			mdns_close(&mif->mif_handle, MDNS_TCP, PF_INET);
+			if (ifm->ifm_type == RTM_DELADDR) {
+				TAILQ_FOREACH_SAFE(ifev, &mif->mif_evlist, ifev_next, ifev2) {
+					event_del(g->g_evl, ifev->ifev_id, NULL);
+					TAILQ_REMOVE(&mif->mif_evlist, ifev, ifev_next);
+					free(ifev);
+				}
+				mdns_close(&mif->mif_handle, MDNS_UDP, PF_INET);
+				mdns_close(&mif->mif_handle, MDNS_TCP, PF_INET);
 #ifdef INET6
-			mdns_close(&mif->mif_handle, MDNS_UDP, PF_INET6);
-			mdns_close(&mif->mif_handle, MDNS_TCP, PF_INET6);
+				mdns_close(&mif->mif_handle, MDNS_UDP, PF_INET6);
+				mdns_close(&mif->mif_handle, MDNS_TCP, PF_INET6);
 #endif
-			setup_socks(mif);
+				mif->mif_flags &= ~(MIF_UDP4 | MIF_TCP4 | MIF_UDP6 | MIF_TCP6);
+			}
+			else if (ifm->ifm_type == RTM_NEWADDR) {
+				setup_socks(mif);
+			}
 			if_release(mif, 1);
 		}
 	}
@@ -915,6 +931,8 @@
 	if (glob.g_bp == NULL)
 		err(EXIT_FAILURE, "Failed to initialize buffer pool");
 
+	setlocale(LC_CTYPE, getenv("LC_CTYPE"));
+
 	/* Daemonize */
 #ifndef DEBUG
 	if (!nodaemon) {
@@ -951,6 +969,8 @@
 	event_add(glob.g_evl, EVENT_TYPE_IO, evh_routesock, &eva,
 	    evh_routesock_init, NULL);
 
+	tmr_start(&glob, 1000, evh_cacheclean, &glob);
+
 	/* Launch the event dispatcher */
 	error = event_dispatch(glob.g_evl, glob.g_wq);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200706201137.l5KBbGo8051406>