Diff for /embedaddon/dnsmasq/src/radv.c between versions 1.1.1.4 and 1.1.1.5

version 1.1.1.4, 2021/03/17 00:56:46 version 1.1.1.5, 2023/09/27 11:02:07
Line 1 Line 1
/* dnsmasq is Copyright (c) 2000-2021 Simon Kelley/* dnsmasq is Copyright (c) 2000-2022 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 123  void ra_start_unsolicited(time_t now, struct dhcp_cont Line 123  void ra_start_unsolicited(time_t now, struct dhcp_cont
      and pick up new interfaces */       and pick up new interfaces */
       
   if (context)    if (context)
    context->ra_short_period_start = context->ra_time = now;    {
       context->ra_short_period_start = now;
       /* start after 1 second to get logging right at startup. */
       context->ra_time = now + 1;
     }
   else    else
     for (context = daemon->dhcp6; context; context = context->next)      for (context = daemon->dhcp6; context; context = context->next)
       if (!(context->flags & CONTEXT_TEMPLATE))        if (!(context->flags & CONTEXT_TEMPLATE))
Line 162  void icmp6_packet(time_t now) Line 166  void icmp6_packet(time_t now)
     return;      return;
         
   packet = (unsigned char *)daemon->outpacket.iov_base;    packet = (unsigned char *)daemon->outpacket.iov_base;
  
   for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))    for (cmptr = CMSG_FIRSTHDR(&msg); cmptr; cmptr = CMSG_NXTHDR(&msg, cmptr))
     if (cmptr->cmsg_level == IPPROTO_IPV6 && cmptr->cmsg_type == daemon->v6pktinfo)      if (cmptr->cmsg_level == IPPROTO_IPV6 && cmptr->cmsg_type == daemon->v6pktinfo)
       {        {
Line 187  void icmp6_packet(time_t now) Line 191  void icmp6_packet(time_t now)
     
   if (packet[1] != 0)    if (packet[1] != 0)
     return;      return;
  
   if (packet[0] == ICMP6_ECHO_REPLY)    if (packet[0] == ICMP6_ECHO_REPLY)
     lease_ping_reply(&from.sin6_addr, packet, interface);       lease_ping_reply(&from.sin6_addr, packet, interface); 
   else if (packet[0] == ND_ROUTER_SOLICIT)    else if (packet[0] == ND_ROUTER_SOLICIT)
     {      {
       char *mac = "";        char *mac = "";
       struct dhcp_bridge *bridge, *alias;        struct dhcp_bridge *bridge, *alias;
         ssize_t rem;
         unsigned char *p;
         int opt_sz;
               
   #ifdef HAVE_DUMPFILE
         dump_packet_icmp(DUMP_RA, (void *)packet, sz, (union mysockaddr *)&from, NULL);
   #endif           
         
       /* look for link-layer address option for logging */        /* look for link-layer address option for logging */
      if (sz >= 16 && packet[8] == ICMP6_OPT_SOURCE_MAC && (packet[9] * 8) + 8 <= sz)      for (rem = sz - 8, p = &packet[8]; rem >= 2; rem -= opt_sz, p += opt_sz)
         {          {
          if ((packet[9] * 8 - 2) * 3 - 1 >= MAXDNAME) {          opt_sz = p[1] * 8;
            return;          
          }          if (opt_sz == 0 || opt_sz > rem)
          print_mac(daemon->namebuff, &packet[10], (packet[9] * 8) - 2);            return; /* Bad packet */
          mac = daemon->namebuff;          
           if (p[0] == ICMP6_OPT_SOURCE_MAC && ((opt_sz - 2) * 3 - 1 < MAXDNAME))
             {
               print_mac(daemon->namebuff, &p[2], opt_sz - 2);
               mac = daemon->namebuff;
             }
         }          }
               
       if (!option_bool(OPT_QUIET_RA))        if (!option_bool(OPT_QUIET_RA))
         my_syslog(MS_DHCP | LOG_INFO, "RTR-SOLICIT(%s) %s", interface, mac);          my_syslog(MS_DHCP | LOG_INFO, "RTR-SOLICIT(%s) %s", interface, mac);
   
Line 543  static void send_ra_alias(time_t now, int iface, char  Line 559  static void send_ra_alias(time_t now, int iface, char 
       setsockopt(daemon->icmp6fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &send_iface, sizeof(send_iface));        setsockopt(daemon->icmp6fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &send_iface, sizeof(send_iface));
     }      }
       
   #ifdef HAVE_DUMPFILE
     {
       struct sockaddr_in6 src;
       src.sin6_family = AF_INET6;
       src.sin6_addr = parm.link_local;
       
       dump_packet_icmp(DUMP_RA, (void *)daemon->outpacket.iov_base, save_counter(-1), (union mysockaddr *)&src, (union mysockaddr *)&addr);
     }
   #endif
   
   while (retry_send(sendto(daemon->icmp6fd, daemon->outpacket.iov_base,     while (retry_send(sendto(daemon->icmp6fd, daemon->outpacket.iov_base, 
                            save_counter(-1), 0, (struct sockaddr *)&addr,                              save_counter(-1), 0, (struct sockaddr *)&addr, 
                            sizeof(addr))));                             sizeof(addr))));
Line 746  static int add_lla(int index, unsigned int type, char  Line 772  static int add_lla(int index, unsigned int type, char 
          add 7 to round up */           add 7 to round up */
       int len = (maclen + 9) >> 3;        int len = (maclen + 9) >> 3;
       unsigned char *p = expand(len << 3);        unsigned char *p = expand(len << 3);
         if (!p)
           return 1;
       memset(p, 0, len << 3);        memset(p, 0, len << 3);
       *p++ = ICMP6_OPT_SOURCE_MAC;        *p++ = ICMP6_OPT_SOURCE_MAC;
       *p++ = len;        *p++ = len;

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


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