Annotation of embedaddon/miniupnpd/bsd/ifacewatcher.c, revision 1.1.1.1

1.1       misho       1: /* $Id: ifacewatcher.c,v 1.3 2011/06/04 16:19:51 nanard Exp $ */
                      2: /* Project MiniUPnP
                      3:  * web : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
                      4:  * (c) 2011 Thomas BERNARD
                      5:  * This software is subject to the conditions detailed
                      6:  * in the LICENCE file provided within the distribution */
                      7: 
                      8: #include "../config.h"
                      9: 
                     10: #include <sys/types.h>
                     11: #include <sys/time.h>
                     12: #include <sys/socket.h>
                     13: #include <net/if.h>
                     14: #include <net/route.h>
                     15: #include <syslog.h>
                     16: 
                     17: #if !defined(SA_LEN)
                     18: #define        SA_LEN(sa)      (sa)->sa_len
                     19: #endif
                     20: 
                     21: #define        SALIGN  (sizeof(long) - 1)
                     22: #define        SA_RLEN(sa)     ((sa)->sa_len ? (((sa)->sa_len + SALIGN) & ~SALIGN) : (SALIGN + 1))
                     23: 
                     24: #include "../upnputils.h"
                     25: #include "../upnpglobalvars.h"
                     26: 
                     27: extern volatile int should_send_public_address_change_notif;
                     28: 
                     29: int
                     30: OpenAndConfInterfaceWatchSocket(void)
                     31: {
                     32:        int s;
                     33: 
                     34:        /*s = socket(PF_ROUTE, SOCK_RAW, AF_INET);*/
                     35:        s = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC);
                     36: /* The family parameter may be AF_UNSPEC which will provide routing informa-
                     37:  * tion for all address families, or can be restricted to a specific address
                     38:  * family by specifying which one is desired.  There can be more than one
                     39:  * routing socket open per system. */
                     40:        if(s < 0) {
                     41:                syslog(LOG_ERR, "OpenAndConfInterfaceWatchSocket socket: %m");
                     42:        }
                     43:        return s;
                     44: }
                     45: 
                     46: void
                     47: ProcessInterfaceWatchNotify(int s)
                     48: {
                     49:        char buf[4096];
                     50:        ssize_t len;
                     51:        char tmp[64];
                     52:        struct rt_msghdr * rtm;
                     53:        struct if_msghdr * ifm;
                     54:        struct ifa_msghdr * ifam;
                     55: #ifdef RTM_IFANNOUNCE
                     56:        struct if_announcemsghdr * ifanm;
                     57: #endif
                     58:        char * p;
                     59:        struct sockaddr * sa;
                     60:        unsigned int ext_if_name_index = 0;
                     61: 
                     62:        len = recv(s, buf, sizeof(buf), 0);
                     63:        if(len < 0) {
                     64:                syslog(LOG_ERR, "ProcessInterfaceWatchNotify recv: %m");
                     65:                return;
                     66:        }
                     67:        if(ext_if_name) {
                     68:                ext_if_name_index = if_nametoindex(ext_if_name);
                     69:        }
                     70:        rtm = (struct rt_msghdr *)buf;
                     71:        syslog(LOG_DEBUG, "%u rt_msg : msglen=%d version=%d type=%d", (unsigned)len,
                     72:               rtm->rtm_msglen, rtm->rtm_version, rtm->rtm_type);       
                     73:        switch(rtm->rtm_type) {
                     74:        case RTM_IFINFO:        /* iface going up/down etc. */
                     75:                ifm = (struct if_msghdr *)buf;
                     76:                syslog(LOG_DEBUG, " RTM_IFINFO: addrs=%x flags=%x index=%hu",
                     77:                       ifm->ifm_addrs, ifm->ifm_flags, ifm->ifm_index);
                     78:                break;
                     79: #ifdef RTM_IFANNOUNCE
                     80:        case RTM_IFANNOUNCE:    /* iface arrival/departure */
                     81:                ifanm = (struct if_announcemsghdr *)buf;
                     82:                syslog(LOG_DEBUG, " RTM_IFANNOUNCE: index=%hu what=%hu ifname=%s",
                     83:                       ifanm->ifan_index, ifanm->ifan_what, ifanm->ifan_name);
                     84:                break;
                     85: #endif
                     86: #ifdef RTM_IEEE80211
                     87:        case RTM_IEEE80211:     /* IEEE80211 wireless event */
                     88:                syslog(LOG_DEBUG, " RTM_IEEE80211");
                     89:                break;
                     90: #endif
                     91:        case RTM_NEWADDR:       /* address being added to iface */
                     92:                ifam = (struct ifa_msghdr *)buf;
                     93:                syslog(LOG_DEBUG, " RTM_NEWADDR: addrs=%x flags=%x index=%hu",
                     94:                       ifam->ifam_addrs, ifam->ifam_flags, ifam->ifam_index);
                     95:                p = buf + sizeof(struct ifa_msghdr);
                     96:                while(p < buf + len) {
                     97:                        sa = (struct sockaddr *)p;
                     98:                        sockaddr_to_string(sa, tmp, sizeof(tmp));
                     99:                        syslog(LOG_DEBUG, "  %s", tmp);
                    100:                        p += SA_RLEN(sa);
                    101:                }
                    102:                if(ifam->ifam_index == ext_if_name_index) {
                    103:                        should_send_public_address_change_notif = 1;
                    104:                }
                    105:                break;
                    106:        case RTM_DELADDR:       /* address being removed from iface */
                    107:                ifam = (struct ifa_msghdr *)buf;
                    108:                if(ifam->ifam_index == ext_if_name_index) {
                    109:                        should_send_public_address_change_notif = 1;
                    110:                }
                    111:                break;
                    112:        default:
                    113:                syslog(LOG_DEBUG, "unprocessed RTM message type=%d", rtm->rtm_type);
                    114:        }
                    115: }
                    116: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>