From owner-p4-projects@FreeBSD.ORG Wed Jun 20 11:37:17 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C3A4516A46C; Wed, 20 Jun 2007 11:37:16 +0000 (UTC) X-Original-To: perforce@FreeBSD.org Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 8123B16A469 for ; Wed, 20 Jun 2007 11:37:16 +0000 (UTC) (envelope-from fli@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 70FFA13C43E for ; Wed, 20 Jun 2007 11:37:16 +0000 (UTC) (envelope-from fli@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l5KBbGs1051412 for ; Wed, 20 Jun 2007 11:37:16 GMT (envelope-from fli@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l5KBbGo8051406 for perforce@freebsd.org; Wed, 20 Jun 2007 11:37:16 GMT (envelope-from fli@FreeBSD.org) Date: Wed, 20 Jun 2007 11:37:16 GMT Message-Id: <200706201137.l5KBbGo8051406@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to fli@FreeBSD.org using -f From: Fredrik Lindberg To: Perforce Change Reviews Cc: Subject: PERFORCE change 122028 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Jun 2007 11:37:17 -0000 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 #include +#include #include +#include #include #include #include @@ -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);