Annotation of embedaddon/miniupnpd/bsd/ifacewatcher.c, revision 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>