Diff for /embedaddon/dnsmasq/src/rfc2131.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 372  size_t dhcp_reply(struct dhcp_context *context, char * Line 372  size_t dhcp_reply(struct dhcp_context *context, char *
       
   if (!context)    if (!context)
     {      {
      my_syslog(MS_DHCP | LOG_WARNING, _("no address range available for DHCP request %s %s"),       const char *via;
                subnet_addr.s_addr ? _("with subnet selector") : _("via"),      if (subnet_addr.s_addr)
                subnet_addr.s_addr ? inet_ntoa(subnet_addr) : (mess->giaddr.s_addr ? inet_ntoa(mess->giaddr) : iface_name));        {
           via = _("with subnet selector");
           inet_ntop(AF_INET, &subnet_addr, daemon->addrbuff, ADDRSTRLEN);
         }
       else
         {
           via = _("via");
           if (mess->giaddr.s_addr)
             inet_ntop(AF_INET, &mess->giaddr, daemon->addrbuff, ADDRSTRLEN);
           else
             safe_strncpy(daemon->addrbuff, iface_name, ADDRSTRLEN);
         }
       my_syslog(MS_DHCP | LOG_WARNING, _("no address range available for DHCP request %s %s"),
                 via, daemon->addrbuff);
       return 0;        return 0;
     }      }
   
Line 383  size_t dhcp_reply(struct dhcp_context *context, char * Line 396  size_t dhcp_reply(struct dhcp_context *context, char *
       struct dhcp_context *context_tmp;        struct dhcp_context *context_tmp;
       for (context_tmp = context; context_tmp; context_tmp = context_tmp->current)        for (context_tmp = context; context_tmp; context_tmp = context_tmp->current)
         {          {
          strcpy(daemon->namebuff, inet_ntoa(context_tmp->start));          inet_ntop(AF_INET, &context_tmp->start, daemon->namebuff, MAXDNAME);
           if (context_tmp->flags & (CONTEXT_STATIC | CONTEXT_PROXY))            if (context_tmp->flags & (CONTEXT_STATIC | CONTEXT_PROXY))
            my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP subnet: %s/%s"),            {
                      ntohl(mess->xid), daemon->namebuff, inet_ntoa(context_tmp->netmask));              inet_ntop(AF_INET, &context_tmp->netmask, daemon->addrbuff, ADDRSTRLEN);
               my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP subnet: %s/%s"),
                         ntohl(mess->xid), daemon->namebuff, daemon->addrbuff);
             }
           else            else
            my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP range: %s -- %s"),             {
                      ntohl(mess->xid), daemon->namebuff, inet_ntoa(context_tmp->end));              inet_ntop(AF_INET, &context_tmp->end, daemon->addrbuff, ADDRSTRLEN);
               my_syslog(MS_DHCP | LOG_INFO, _("%u available DHCP range: %s -- %s"),
                         ntohl(mess->xid), daemon->namebuff, daemon->addrbuff);
             }
         }          }
     }      }
       
Line 1031  size_t dhcp_reply(struct dhcp_context *context, char * Line 1050  size_t dhcp_reply(struct dhcp_context *context, char *
           config->addr.s_addr == option_addr(opt).s_addr)            config->addr.s_addr == option_addr(opt).s_addr)
         {          {
           prettyprint_time(daemon->dhcp_buff, DECLINE_BACKOFF);            prettyprint_time(daemon->dhcp_buff, DECLINE_BACKOFF);
             inet_ntop(AF_INET, &config->addr, daemon->addrbuff, ADDRSTRLEN);
           my_syslog(MS_DHCP | LOG_WARNING, _("disabling DHCP static address %s for %s"),             my_syslog(MS_DHCP | LOG_WARNING, _("disabling DHCP static address %s for %s"), 
                    inet_ntoa(config->addr), daemon->dhcp_buff);                    daemon->addrbuff, daemon->dhcp_buff);
           config->flags |= CONFIG_DECLINED;            config->flags |= CONFIG_DECLINED;
           config->decline_time = now;            config->decline_time = now;
         }          }
Line 1078  size_t dhcp_reply(struct dhcp_context *context, char * Line 1098  size_t dhcp_reply(struct dhcp_context *context, char *
                       
           if (have_config(config, CONFIG_ADDR))            if (have_config(config, CONFIG_ADDR))
             {              {
              char *addrs = inet_ntoa(config->addr);              inet_ntop(AF_INET, &config->addr, daemon->addrbuff, ADDRSTRLEN);
                               
               if ((ltmp = lease_find_by_addr(config->addr)) &&                 if ((ltmp = lease_find_by_addr(config->addr)) && 
                   ltmp != lease &&                    ltmp != lease &&
Line 1088  size_t dhcp_reply(struct dhcp_context *context, char * Line 1108  size_t dhcp_reply(struct dhcp_context *context, char *
                   unsigned char *mac = extended_hwaddr(ltmp->hwaddr_type, ltmp->hwaddr_len,                    unsigned char *mac = extended_hwaddr(ltmp->hwaddr_type, ltmp->hwaddr_len,
                                                        ltmp->hwaddr, ltmp->clid_len, ltmp->clid, &len);                                                         ltmp->hwaddr, ltmp->clid_len, ltmp->clid, &len);
                   my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is leased to %s"),                    my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is leased to %s"),
                            addrs, print_mac(daemon->namebuff, mac, len));                            daemon->addrbuff, print_mac(daemon->namebuff, mac, len));
                 }                  }
               else                else
                 {                  {
Line 1097  size_t dhcp_reply(struct dhcp_context *context, char * Line 1117  size_t dhcp_reply(struct dhcp_context *context, char *
                     if (context->router.s_addr == config->addr.s_addr)                      if (context->router.s_addr == config->addr.s_addr)
                       break;                        break;
                   if (tmp)                    if (tmp)
                    my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is in use by the server or relay"), addrs);                    my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it is in use by the server or relay"), daemon->addrbuff);
                   else if (have_config(config, CONFIG_DECLINED) &&                    else if (have_config(config, CONFIG_DECLINED) &&
                            difftime(now, config->decline_time) < (float)DECLINE_BACKOFF)                             difftime(now, config->decline_time) < (float)DECLINE_BACKOFF)
                    my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it was previously declined"), addrs);                    my_syslog(MS_DHCP | LOG_WARNING, _("not using configured address %s because it was previously declined"), daemon->addrbuff);
                   else                    else
                     conf = config->addr;                      conf = config->addr;
                 }                  }
Line 1133  size_t dhcp_reply(struct dhcp_context *context, char * Line 1153  size_t dhcp_reply(struct dhcp_context *context, char *
           tagif_netid = run_tag_if(&context->netid);            tagif_netid = run_tag_if(&context->netid);
         }          }
   
       log_tags(tagif_netid, ntohl(mess->xid));  
       apply_delay(mess->xid, recvtime, tagif_netid);        apply_delay(mess->xid, recvtime, tagif_netid);
   
       if (option_bool(OPT_RAPID_COMMIT) && option_find(mess, sz, OPTION_RAPID_COMMIT, 0))        if (option_bool(OPT_RAPID_COMMIT) && option_find(mess, sz, OPTION_RAPID_COMMIT, 0))
         {          {
           rapid_commit = 1;            rapid_commit = 1;
             /* If a lease exists for this host and another address, squash it. */
             if (lease && lease->addr.s_addr != mess->yiaddr.s_addr)
               {
                 lease_prune(lease, now);
                 lease = NULL;
               }
           goto rapid_commit;            goto rapid_commit;
         }          }
               
         log_tags(tagif_netid, ntohl(mess->xid));
   
       daemon->metrics[METRIC_DHCPOFFER]++;        daemon->metrics[METRIC_DHCPOFFER]++;
       log_packet("DHCPOFFER" , &mess->yiaddr, emac, emac_len, iface_name, NULL, NULL, mess->xid);        log_packet("DHCPOFFER" , &mess->yiaddr, emac, emac_len, iface_name, NULL, NULL, mess->xid);
               
Line 1303  size_t dhcp_reply(struct dhcp_context *context, char * Line 1330  size_t dhcp_reply(struct dhcp_context *context, char *
                  a lease from one of it's MACs to give the address to another. */                   a lease from one of it's MACs to give the address to another. */
               if (config && config_has_mac(config, ltmp->hwaddr, ltmp->hwaddr_len, ltmp->hwaddr_type))                if (config && config_has_mac(config, ltmp->hwaddr, ltmp->hwaddr_len, ltmp->hwaddr_type))
                 {                  {
                     inet_ntop(AF_INET, &ltmp->addr, daemon->addrbuff, ADDRSTRLEN);
                   my_syslog(MS_DHCP | LOG_INFO, _("abandoning lease to %s of %s"),                    my_syslog(MS_DHCP | LOG_INFO, _("abandoning lease to %s of %s"),
                             print_mac(daemon->namebuff, ltmp->hwaddr, ltmp->hwaddr_len),                               print_mac(daemon->namebuff, ltmp->hwaddr, ltmp->hwaddr_len), 
                            inet_ntoa(ltmp->addr));                            daemon->addrbuff);
                   lease = ltmp;                    lease = ltmp;
                 }                  }
               else                else
Line 1399  size_t dhcp_reply(struct dhcp_context *context, char * Line 1427  size_t dhcp_reply(struct dhcp_context *context, char *
                   /* DNSMASQ_REQUESTED_OPTIONS */                    /* DNSMASQ_REQUESTED_OPTIONS */
                   if ((opt = option_find(mess, sz, OPTION_REQUESTED_OPTIONS, 1)))                    if ((opt = option_find(mess, sz, OPTION_REQUESTED_OPTIONS, 1)))
                     {                      {
                      int len = option_len(opt);                      int i, len = option_len(opt);
                       unsigned char *rop = option_ptr(opt, 0);                        unsigned char *rop = option_ptr(opt, 0);
                      char *q = daemon->namebuff;                      
                      int i; 
                       for (i = 0; i < len; i++)                        for (i = 0; i < len; i++)
                        {                        lease_add_extradata(lease, (unsigned char *)daemon->namebuff,
                          q += snprintf(q, MAXDNAME - (q - daemon->namebuff), "%d%s", rop[i], i + 1 == len ? "" : ",");                                            sprintf(daemon->namebuff, "%u", rop[i]), (i + 1) == len ? 0 : ',');
                        } 
                      lease_add_extradata(lease, (unsigned char *)daemon->namebuff, (q - daemon->namebuff), 0);  
                     }                      }
                   else                    else
                    {                    lease_add_extradata(lease, NULL, 0, 0);
                      add_extradata_opt(lease, NULL);                  
                    }                  add_extradata_opt(lease, option_find(mess, sz, OPTION_MUD_URL_V4, 1));
                  
                   /* space-concat tag set */                    /* space-concat tag set */
                   if (!tagif_netid)                    if (!tagif_netid)
                     add_extradata_opt(lease, NULL);                      add_extradata_opt(lease, NULL);
Line 1653  static int sanitise(unsigned char *opt, char *buf) Line 1678  static int sanitise(unsigned char *opt, char *buf)
   for (i = option_len(opt); i > 0; i--)    for (i = option_len(opt); i > 0; i--)
     {      {
       char c = *p++;        char c = *p++;
      if (isprint((int)c))      if (isprint((unsigned char)c))
         *buf++ = c;          *buf++ = c;
     }      }
   *buf = 0; /* add terminator */    *buf = 0; /* add terminator */
Line 1674  static void add_extradata_opt(struct dhcp_lease *lease Line 1699  static void add_extradata_opt(struct dhcp_lease *lease
 static void log_packet(char *type, void *addr, unsigned char *ext_mac,   static void log_packet(char *type, void *addr, unsigned char *ext_mac, 
                        int mac_len, char *interface, char *string, char *err, u32 xid)                         int mac_len, char *interface, char *string, char *err, u32 xid)
 {  {
   struct in_addr a;  
    
   if (!err && !option_bool(OPT_LOG_OPTS) && option_bool(OPT_QUIET_DHCP))    if (!err && !option_bool(OPT_LOG_OPTS) && option_bool(OPT_QUIET_DHCP))
     return;      return;
       
  /* addr may be misaligned */  daemon->addrbuff[0] = 0;
   if (addr)    if (addr)
    memcpy(&a, addr, sizeof(a));    inet_ntop(AF_INET, addr, daemon->addrbuff, ADDRSTRLEN);
       
   print_mac(daemon->namebuff, ext_mac, mac_len);    print_mac(daemon->namebuff, ext_mac, mac_len);
       
  if(option_bool(OPT_LOG_OPTS))  if (option_bool(OPT_LOG_OPTS))
     my_syslog(MS_DHCP | LOG_INFO, "%u %s(%s) %s%s%s %s%s",    my_syslog(MS_DHCP | LOG_INFO, "%u %s(%s) %s%s%s %s%s",
               ntohl(xid),               ntohl(xid), 
               type,              type,
               interface,               interface, 
               addr ? inet_ntoa(a) : "",              daemon->addrbuff,
               addr ? " " : "",              addr ? " " : "",
               daemon->namebuff,              daemon->namebuff,
               string ? string : "",              string ? string : "",
               err ? err : "");              err ? err : "");
   else    else
     my_syslog(MS_DHCP | LOG_INFO, "%s(%s) %s%s%s %s%s",      my_syslog(MS_DHCP | LOG_INFO, "%s(%s) %s%s%s %s%s",
               type,                type,
               interface,                 interface, 
              addr ? inet_ntoa(a) : "",              daemon->addrbuff,
               addr ? " " : "",                addr ? " " : "",
               daemon->namebuff,                daemon->namebuff,
               string ? string : "",                string ? string : "",
               err ? err : "");                err ? err : "");
  
 #ifdef HAVE_UBUS  #ifdef HAVE_UBUS
        if (!strcmp(type, "DHCPACK"))  if (!strcmp(type, "DHCPACK"))
                ubus_event_bcast("dhcp.ack", daemon->namebuff, addr ? inet_ntoa(a) : NULL, string ? string : NULL, interface);    ubus_event_bcast("dhcp.ack", daemon->namebuff, addr ? daemon->addrbuff : NULL, string, interface);
        else if (!strcmp(type, "DHCPRELEASE"))  else if (!strcmp(type, "DHCPRELEASE"))
                ubus_event_bcast("dhcp.release", daemon->namebuff, addr ? inet_ntoa(a) : NULL, string ? string : NULL, interface);    ubus_event_bcast("dhcp.release", daemon->namebuff, addr ? daemon->addrbuff : NULL, string, interface);
 #endif  #endif
 }  }
   
Line 1861  static size_t dhcp_packet_size(struct dhcp_packet *mes Line 1884  static size_t dhcp_packet_size(struct dhcp_packet *mes
   if (option_bool(OPT_LOG_OPTS))    if (option_bool(OPT_LOG_OPTS))
     {      {
       if (mess->siaddr.s_addr != 0)        if (mess->siaddr.s_addr != 0)
        my_syslog(MS_DHCP | LOG_INFO, _("%u next server: %s"), ntohl(mess->xid), inet_ntoa(mess->siaddr));        {
           inet_ntop(AF_INET, &mess->siaddr, daemon->addrbuff, ADDRSTRLEN);
           my_syslog(MS_DHCP | LOG_INFO, _("%u next server: %s"), ntohl(mess->xid), daemon->addrbuff);
         }
               
       if ((mess->flags & htons(0x8000)) && mess->ciaddr.s_addr == 0)        if ((mess->flags & htons(0x8000)) && mess->ciaddr.s_addr == 0)
         my_syslog(MS_DHCP | LOG_INFO, _("%u broadcast response"), ntohl(mess->xid));          my_syslog(MS_DHCP | LOG_INFO, _("%u broadcast response"), ntohl(mess->xid));
Line 2178  static int pxe_uefi_workaround(int pxe_arch, struct dh Line 2204  static int pxe_uefi_workaround(int pxe_arch, struct dh
       inet_ntop(AF_INET, &mess->siaddr, (char *)mess->sname, INET_ADDRSTRLEN);        inet_ntop(AF_INET, &mess->siaddr, (char *)mess->sname, INET_ADDRSTRLEN);
     }      }
       
  snprintf((char *)mess->file, sizeof(mess->file),   if (found->basename)
           strchr(found->basename, '.') ? "%s" : "%s.0", found->basename);    snprintf((char *)mess->file, sizeof(mess->file), 
              strchr(found->basename, '.') ? "%s" : "%s.0", found->basename);
       
   return 1;    return 1;
 }  }
Line 2785  static void apply_delay(u32 xid, time_t recvtime, stru Line 2812  static void apply_delay(u32 xid, time_t recvtime, stru
     }      }
 }  }
   
#endif#endif /* HAVE_DHCP */
   
 
   
   
 
 
   

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


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