Diff for /embedaddon/dnsmasq/src/bpf.c between versions 1.1.1.2 and 1.1.1.4

version 1.1.1.2, 2014/06/15 16:31:38 version 1.1.1.4, 2021/03/17 00:56:46
Line 1 Line 1
/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley/* dnsmasq is Copyright (c) 2000-2021 Simon Kelley
   
    This program is free software; you can redistribute it and/or modify     This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by     it under the terms of the GNU General Public License as published by
Line 20 Line 20
 #include <ifaddrs.h>  #include <ifaddrs.h>
   
 #include <sys/param.h>  #include <sys/param.h>
   #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
 #include <sys/sysctl.h>  #include <sys/sysctl.h>
   #endif
 #include <net/if.h>  #include <net/if.h>
 #include <net/route.h>  #include <net/route.h>
 #include <net/if_dl.h>  #include <net/if_dl.h>
Line 29 Line 31
 #  include <net/if_var.h>   #  include <net/if_var.h> 
 #endif  #endif
 #include <netinet/in_var.h>  #include <netinet/in_var.h>
#ifdef HAVE_IPV6#include <netinet6/in6_var.h>
#  include <netinet6/in6_var.h> 
#endif 
   
 #ifndef SA_SIZE  #ifndef SA_SIZE
 #define SA_SIZE(sa)                                             \  #define SA_SIZE(sa)                                             \
Line 42 Line 42
   
 #ifdef HAVE_BSD_NETWORK  #ifdef HAVE_BSD_NETWORK
 static int del_family = 0;  static int del_family = 0;
static struct all_addr del_addr;static union all_addr del_addr;
 #endif  #endif
   
 #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)  #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
Line 103  int arp_enumerate(void *parm, int (*callback)()) Line 103  int arp_enumerate(void *parm, int (*callback)())
 int iface_enumerate(int family, void *parm, int (*callback)())  int iface_enumerate(int family, void *parm, int (*callback)())
 {  {
   struct ifaddrs *head, *addrs;    struct ifaddrs *head, *addrs;
  int errsav, fd = -1, ret = 0;  int errsave, fd = -1, ret = 0;
   
   if (family == AF_UNSPEC)    if (family == AF_UNSPEC)
 #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)  #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
Line 119  int iface_enumerate(int family, void *parm, int (*call Line 119  int iface_enumerate(int family, void *parm, int (*call
   if (getifaddrs(&head) == -1)    if (getifaddrs(&head) == -1)
     return 0;      return 0;
   
#if defined(HAVE_BSD_NETWORK) && defined(HAVE_IPV6)#if defined(HAVE_BSD_NETWORK)
   if (family == AF_INET6)    if (family == AF_INET6)
     fd = socket(PF_INET6, SOCK_DGRAM, 0);      fd = socket(PF_INET6, SOCK_DGRAM, 0);
 #endif  #endif
Line 139  int iface_enumerate(int family, void *parm, int (*call Line 139  int iface_enumerate(int family, void *parm, int (*call
               struct in_addr addr, netmask, broadcast;                struct in_addr addr, netmask, broadcast;
               addr = ((struct sockaddr_in *) addrs->ifa_addr)->sin_addr;                addr = ((struct sockaddr_in *) addrs->ifa_addr)->sin_addr;
 #ifdef HAVE_BSD_NETWORK  #ifdef HAVE_BSD_NETWORK
              if (del_family == AF_INET && del_addr.addr.addr4.s_addr == addr.s_addr)              if (del_family == AF_INET && del_addr.addr4.s_addr == addr.s_addr)
                 continue;                  continue;
 #endif  #endif
               netmask = ((struct sockaddr_in *) addrs->ifa_netmask)->sin_addr;                netmask = ((struct sockaddr_in *) addrs->ifa_netmask)->sin_addr;
Line 150  int iface_enumerate(int family, void *parm, int (*call Line 150  int iface_enumerate(int family, void *parm, int (*call
               if (!((*callback)(addr, iface_index, NULL, netmask, broadcast, parm)))                if (!((*callback)(addr, iface_index, NULL, netmask, broadcast, parm)))
                 goto err;                  goto err;
             }              }
 #ifdef HAVE_IPV6  
           else if (family == AF_INET6)            else if (family == AF_INET6)
             {              {
               struct in6_addr *addr = &((struct sockaddr_in6 *) addrs->ifa_addr)->sin6_addr;                struct in6_addr *addr = &((struct sockaddr_in6 *) addrs->ifa_addr)->sin6_addr;
Line 160  int iface_enumerate(int family, void *parm, int (*call Line 159  int iface_enumerate(int family, void *parm, int (*call
               u32 valid = 0xffffffff, preferred = 0xffffffff;                u32 valid = 0xffffffff, preferred = 0xffffffff;
               int flags = 0;                int flags = 0;
 #ifdef HAVE_BSD_NETWORK  #ifdef HAVE_BSD_NETWORK
              if (del_family == AF_INET6 && IN6_ARE_ADDR_EQUAL(&del_addr.addr.addr6, addr))              if (del_family == AF_INET6 && IN6_ARE_ADDR_EQUAL(&del_addr.addr6, addr))
                 continue;                  continue;
 #endif  #endif
 #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)  #if defined(HAVE_BSD_NETWORK) && !defined(__APPLE__)
               struct in6_ifreq ifr6;                struct in6_ifreq ifr6;
   
               memset(&ifr6, 0, sizeof(ifr6));                memset(&ifr6, 0, sizeof(ifr6));
              strncpy(ifr6.ifr_name, addrs->ifa_name, sizeof(ifr6.ifr_name));              safe_strncpy(ifr6.ifr_name, addrs->ifa_name, sizeof(ifr6.ifr_name));
                               
               ifr6.ifr_addr = *((struct sockaddr_in6 *) addrs->ifa_addr);                ifr6.ifr_addr = *((struct sockaddr_in6 *) addrs->ifa_addr);
               if (fd != -1 && ioctl(fd, SIOCGIFAFLAG_IN6, &ifr6) != -1)                if (fd != -1 && ioctl(fd, SIOCGIFAFLAG_IN6, &ifr6) != -1)
Line 217  int iface_enumerate(int family, void *parm, int (*call Line 216  int iface_enumerate(int family, void *parm, int (*call
                                 (int) preferred, (int)valid, parm)))                                  (int) preferred, (int)valid, parm)))
                 goto err;                               goto err;             
             }              }
 #endif /* HAVE_IPV6 */  
   
 #ifdef HAVE_DHCP6        #ifdef HAVE_DHCP6      
           else if (family == AF_LINK)            else if (family == AF_LINK)
Line 235  int iface_enumerate(int family, void *parm, int (*call Line 233  int iface_enumerate(int family, void *parm, int (*call
   ret = 1;    ret = 1;
   
  err:   err:
  errsav = errno;  errsave = errno;
   freeifaddrs(head);     freeifaddrs(head); 
   if (fd != -1)    if (fd != -1)
     close(fd);      close(fd);
  errno = errsav;  errno = errsave;
   
   return ret;    return ret;
 }  }
Line 359  void send_via_bpf(struct dhcp_packet *mess, size_t len Line 357  void send_via_bpf(struct dhcp_packet *mess, size_t len
   iov[3].iov_base = mess;    iov[3].iov_base = mess;
   iov[3].iov_len = len;    iov[3].iov_len = len;
   
  while (writev(daemon->dhcp_raw_fd, iov, 4) == -1 && retry_send());  while (retry_send(writev(daemon->dhcp_raw_fd, iov, 4)));
 }  }
   
 #endif /* defined(HAVE_BSD_NETWORK) && defined(HAVE_DHCP) */  #endif /* defined(HAVE_BSD_NETWORK) && defined(HAVE_DHCP) */
Line 376  void route_init(void) Line 374  void route_init(void)
     die(_("cannot create PF_ROUTE socket: %s"), NULL, EC_BADNET);      die(_("cannot create PF_ROUTE socket: %s"), NULL, EC_BADNET);
 }  }
   
void route_sock(time_t now)void route_sock(void)
 {  {
   struct if_msghdr *msg;    struct if_msghdr *msg;
   int rc = recv(daemon->routefd, daemon->packet, daemon->packet_buff_sz, 0);    int rc = recv(daemon->routefd, daemon->packet, daemon->packet_buff_sz, 0);
Line 401  void route_sock(time_t now) Line 399  void route_sock(time_t now)
    else if (msg->ifm_type == RTM_NEWADDR)     else if (msg->ifm_type == RTM_NEWADDR)
      {       {
        del_family = 0;         del_family = 0;
       newaddress(now);       queue_event(EVENT_NEWADDR);
      }       }
    else if (msg->ifm_type == RTM_DELADDR)     else if (msg->ifm_type == RTM_DELADDR)
      {       {
Line 424  void route_sock(time_t now) Line 422  void route_sock(time_t now)
                {                 {
                  del_family = sa->sa_family;                   del_family = sa->sa_family;
                  if (del_family == AF_INET)                   if (del_family == AF_INET)
                   del_addr.addr.addr4 = ((struct sockaddr_in *)sa)->sin_addr;                   del_addr.addr4 = ((struct sockaddr_in *)sa)->sin_addr;
#ifdef HAVE_IPV6 
                  else if (del_family == AF_INET6)                   else if (del_family == AF_INET6)
                   del_addr.addr.addr6 = ((struct sockaddr_in6 *)sa)->sin6_addr;                   del_addr.addr6 = ((struct sockaddr_in6 *)sa)->sin6_addr;
#endif 
                  else                   else
                    del_family = 0;                     del_family = 0;
                }                 }
Line 439  void route_sock(time_t now) Line 435  void route_sock(time_t now)
                of += sizeof(long) - (diff & (sizeof(long) - 1));                 of += sizeof(long) - (diff & (sizeof(long) - 1));
            }             }
                 
       newaddress(now);       queue_event(EVENT_NEWADDR);
      }       }
 }  }
   

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.4


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