PERFORCE change 122028 for review
Fredrik Lindberg
fli at FreeBSD.org
Wed Jun 20 11:37:17 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=122028
Change 122028 by fli at 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);
More information about the p4-projects
mailing list