Diff for /embedaddon/mpd/src/iface.c between versions 1.1.1.3 and 1.1.1.5

version 1.1.1.3, 2016/11/01 09:56:12 version 1.1.1.5, 2021/03/17 00:39:23
Line 19 Line 19
 #include "netgraph.h"  #include "netgraph.h"
 #include "util.h"  #include "util.h"
   
   #include <sys/limits.h>
 #include <sys/types.h>  #include <sys/types.h>
 #include <sys/sockio.h>  #include <sys/sockio.h>
 #include <sys/sysctl.h>  #include <sys/sysctl.h>
Line 98 Line 99
   static void   IfaceNgIpv6Shutdown(Bund b);    static void   IfaceNgIpv6Shutdown(Bund b);
   
 #ifdef USE_NG_NETFLOW  #ifdef USE_NG_NETFLOW
  static int    IfaceInitNetflow(Bund b, char *path, char *hook, char in, char out, int v6);  static int    IfaceInitNetflow(Bund b, char *path, char *hook, char out, int v6);
   static int    IfaceSetupNetflow(Bund b, char in, char out, int v6);    static int    IfaceSetupNetflow(Bund b, char in, char out, int v6);
  static void   IfaceShutdownNetflow(Bund b, char in, char out, int v6);  static void   IfaceShutdownNetflow(Bund b, char out, int v6);
 #endif  #endif
   
 #ifdef USE_NG_IPACCT  #ifdef USE_NG_IPACCT
Line 129 Line 130
   static void   IfaceShutdownLimits(Bund b);    static void   IfaceShutdownLimits(Bund b);
 #endif  #endif
   
  static int    IfaceSetCommand(Context ctx, int ac, char *av[], void *arg);  static int    IfaceSetCommand(Context ctx, int ac, const char *const av[], const void *arg);
   static void   IfaceSessionTimeout(void *arg);    static void   IfaceSessionTimeout(void *arg);
   static void   IfaceIdleTimeout(void *arg);    static void   IfaceIdleTimeout(void *arg);
   
Line 141 Line 142
   static int    IfaceAllocACL (struct acl_pool ***ap, int start, char * ifname, int number);    static int    IfaceAllocACL (struct acl_pool ***ap, int start, char * ifname, int number);
   static int    IfaceFindACL (struct acl_pool *ap, char * ifname, int number);    static int    IfaceFindACL (struct acl_pool *ap, char * ifname, int number);
   static char * IfaceParseACL (char * src, IfaceState iface);    static char * IfaceParseACL (char * src, IfaceState iface);
     static char * IfaceFixAclForDelete(char *r, char *buf, size_t len);
 #endif  #endif
   
   static int    IfaceSetName(Bund b, const char * ifname);    static int    IfaceSetName(Bund b, const char * ifname);
Line 161 Line 163
         IfaceSetCommand, NULL, 2, (void *) SET_ADDRS },          IfaceSetCommand, NULL, 2, (void *) SET_ADDRS },
     { "route {dest}[/{width}]",         "Add IP route",      { "route {dest}[/{width}]",         "Add IP route",
         IfaceSetCommand, NULL, 2, (void *) SET_ROUTE },          IfaceSetCommand, NULL, 2, (void *) SET_ROUTE },
    { "mtu {size}",                      "Set max allowed interface MTU",    { "mtu {size} [override]",                "Set max allowed or override interface MTU",
         IfaceSetCommand, NULL, 2, (void *) SET_MTU },          IfaceSetCommand, NULL, 2, (void *) SET_MTU },
     { "name [{name}]",                  "Set interface name",      { "name [{name}]",                  "Set interface name",
         IfaceSetCommand, NULL, 2, (void *) SET_NAME },          IfaceSetCommand, NULL, 2, (void *) SET_NAME },
Line 187 Line 189
         IfaceSetCommand, NULL, 2, (void *) SET_ENABLE },          IfaceSetCommand, NULL, 2, (void *) SET_ENABLE },
     { "disable [opt ...]",              "Disable option",      { "disable [opt ...]",              "Disable option",
         IfaceSetCommand, NULL, 2, (void *) SET_DISABLE },          IfaceSetCommand, NULL, 2, (void *) SET_DISABLE },
    { NULL },    { NULL, NULL, NULL, NULL, 0, NULL },
   };    };
   
 /*  /*
Line 288  IfaceInit(Bund b) Line 290  IfaceInit(Bund b)
   /* Default configuration */    /* Default configuration */
   iface->mtu = NG_IFACE_MTU_DEFAULT;    iface->mtu = NG_IFACE_MTU_DEFAULT;
   iface->max_mtu = NG_IFACE_MTU_DEFAULT;    iface->max_mtu = NG_IFACE_MTU_DEFAULT;
     iface->mtu_override = 0;
 #ifdef SIOCSIFDESCR  #ifdef SIOCSIFDESCR
   iface->ifdescr = NULL;    iface->ifdescr = NULL;
   iface->conf.ifdescr = NULL;    iface->conf.ifdescr = NULL;
Line 602  IfaceUp(Bund b, int ready) Line 605  IfaceUp(Bund b, int ready)
   while (acls != NULL) {    while (acls != NULL) {
     /* allow both %aX and `peer_addr` macros */      /* allow both %aX and `peer_addr` macros */
     buf = IfaceParseACL(acls->rule, iface);      buf = IfaceParseACL(acls->rule, iface);
    strcpy(acls->rule, buf);    acl = Mdup2(MB_IPFW, acls, sizeof(struct acl), sizeof(struct acl) + strlen(buf));
     strcpy(acl->rule, buf);
     Freee(buf);      Freee(buf);
     acl = Mdup(MB_IPFW, acls, sizeof(struct acl) + strlen(acls->rule));  
     acl->next = iface->tables;      acl->next = iface->tables;
     iface->tables = acl;      iface->tables = acl;
    if (strncmp(acls->rule, "peer_addr", 9) == 0) {    if (strncmp(acl->rule, "peer_addr", 9) == 0) {
         char hisaddr[20];          char hisaddr[20];
        ExecCmd(LG_IFACE2, b->name, "%s table %d add %s",        ExecCmd(LG_IFACE2, b->name, "%s -q table %d add %s",
            PATH_IPFW, acls->real_number,            PATH_IPFW, acl->real_number,
             u_addrtoa(&iface->peer_addr, hisaddr, sizeof(hisaddr)));              u_addrtoa(&iface->peer_addr, hisaddr, sizeof(hisaddr)));
     } else {      } else {
        ExecCmd(LG_IFACE2, b->name, "%s table %d add %s", PATH_IPFW, acls->real_number, acls->rule);        ExecCmd(LG_IFACE2, b->name, "%s -q table %d add %s", PATH_IPFW, acl->real_number, acl->rule);
     }      }
     acls = acls->next;      acls = acls->next;
   };    };
Line 648  IfaceDown(Bund b) Line 651  IfaceDown(Bund b)
   IfaceState    const iface = &b->iface;    IfaceState    const iface = &b->iface;
 #ifdef USE_IPFW  #ifdef USE_IPFW
   struct acl_pool       **rp, *rp1;    struct acl_pool       **rp, *rp1;
  char          cb[32768];  char          cb[LINE_MAX - sizeof(PATH_IPFW) - 14];
   struct acl    *acl, *aclnext;    struct acl    *acl, *aclnext;
 #endif  #endif
   
Line 693  IfaceDown(Bund b) Line 696  IfaceDown(Bund b)
   while (acl != NULL) {    while (acl != NULL) {
     if (strncmp(acl->rule, "peer_addr", 9) == 0) {      if (strncmp(acl->rule, "peer_addr", 9) == 0) {
       char hisaddr[20];        char hisaddr[20];
      ExecCmd(LG_IFACE2, b->name, "%s table %d delete %s",      ExecCmd(LG_IFACE2, b->name, "%s -q table %d delete %s",
         PATH_IPFW, acl->real_number,          PATH_IPFW, acl->real_number,
         u_addrtoa(&iface->peer_addr, hisaddr, sizeof(hisaddr)));          u_addrtoa(&iface->peer_addr, hisaddr, sizeof(hisaddr)));
     } else {      } else {
      ExecCmd(LG_IFACE2, b->name, "%s table %d delete %s",      char buf[ACL_LEN];
        PATH_IPFW, acl->real_number, acl->rule);      ExecCmd(LG_IFACE2, b->name, "%s -q table %d delete %s",
         PATH_IPFW, acl->real_number,
         IfaceFixAclForDelete(acl->rule, buf, sizeof(buf)));
     }      }
     aclnext = acl->next;      aclnext = acl->next;
     Freee(acl);      Freee(acl);
Line 946  IfaceParseACL (char * src, IfaceState iface) Line 951  IfaceParseACL (char * src, IfaceState iface)
     Freee(buf1);      Freee(buf1);
     return(buf);      return(buf);
 }  }
   
   /*
    * IfaceFixAclForDelete()
    *
    * Removes values from ipfw 'table-key value [...]' expression r, if any.
    * Returns buf pointer for modified expression or original r pointer
    * if no modifications were performed when no values were found or
    * buf found too short.
    *
    * len is size of buf. Strings are zero-terminated.
    * r and buf must point to non-overlapping memory areas.
    */
   
   static char*
   IfaceFixAclForDelete(char *r, char *buf, size_t len)
   {
     static const char sep[] = " \t";
     char *limit, *orig, *s;
     int  i, state = 0; 
   
   /*
    * Possible state values:
    *
    * -1: skip value (otherwise copy);
    *  0: first iteration, do copy;
    *  1: not first iteration, do copy.
   */
   
     orig = r;
     s = buf;
     limit = buf + len;
   
     for (r += strspn(r, sep);             /* Skip leading spaces.             */
          *r;                              /* Check for end of string.         */
          r += i, r += strspn(r, sep))     /* Advance and skip spaces again.   */
     {
       i = strcspn(r, sep);                /* Find separator or end of string. */
       if (state == 0 && r[i] == '\0')     /* No separators in the rule?       */
         return r;
       if (state < 0) {                    /* Skip value.                      */
         state = 1;
         continue;
       }
       if (limit - s < i + 1 + state)      /* Check space.                     */
         return orig;
       if (state != 0)                     /* Insert separator.                */
         *s++ = ' ';
       memcpy(s, r, i);                    /* Copy IP address from the rule.   */
       s += i;
       state = -1;
     }
     *s = '\0';
   
     return buf;
   }
 #endif /* USE_IPFW */  #endif /* USE_IPFW */
   
 /*  /*
Line 1384  IfaceIsDemand(int proto, Mbuf pkt) Line 1444  IfaceIsDemand(int proto, Mbuf pkt)
         if (MBLEN(pkt) < sizeof(struct ip))          if (MBLEN(pkt) < sizeof(struct ip))
             return (0);              return (0);
   
        ip = (struct ip *)MBDATA(pkt);        ip = (struct ip *)(void *)MBDATA(pkt);
         switch (ip->ip_p) {          switch (ip->ip_p) {
           case IPPROTO_IGMP:            /* No multicast stuff */            case IPPROTO_IGMP:            /* No multicast stuff */
             return(0);              return(0);
Line 1396  IfaceIsDemand(int proto, Mbuf pkt) Line 1456  IfaceIsDemand(int proto, Mbuf pkt)
               if (MBLEN(pkt) < (ip->ip_hl * 4 + sizeof(struct icmphdr)))                if (MBLEN(pkt) < (ip->ip_hl * 4 + sizeof(struct icmphdr)))
                 return (0);                  return (0);
   
              icmp = (struct icmphdr *) ((u_int32_t *) ip + ip->ip_hl);              icmp = (struct icmphdr *) ((u_int32_t *)(void *) ip + ip->ip_hl);
   
               switch (icmp->icmp_type)  /* No ICMP replies */                switch (icmp->icmp_type)  /* No ICMP replies */
               {                {
Line 1417  IfaceIsDemand(int proto, Mbuf pkt) Line 1477  IfaceIsDemand(int proto, Mbuf pkt)
               if (MBLEN(pkt) < (ip->ip_hl * 4 + sizeof(struct udphdr)))                if (MBLEN(pkt) < (ip->ip_hl * 4 + sizeof(struct udphdr)))
                 return (0);                  return (0);
   
              udp = (struct udphdr *) ((u_int32_t *) ip + ip->ip_hl);              udp = (struct udphdr *) ((u_int32_t *)(void *) ip + ip->ip_hl);
   
 #define NTP_PORT        123  #define NTP_PORT        123
               if (ntohs(udp->uh_dport) == NTP_PORT)     /* No NTP packets */                if (ntohs(udp->uh_dport) == NTP_PORT)     /* No NTP packets */
Line 1431  IfaceIsDemand(int proto, Mbuf pkt) Line 1491  IfaceIsDemand(int proto, Mbuf pkt)
               if (MBLEN(pkt) < (ip->ip_hl * 4 + sizeof(struct tcphdr)))                if (MBLEN(pkt) < (ip->ip_hl * 4 + sizeof(struct tcphdr)))
                 return (0);                  return (0);
   
              tcp = (struct tcphdr *) ((u_int32_t *) ip + ip->ip_hl);              tcp = (struct tcphdr *) ((u_int32_t *)(void *) ip + ip->ip_hl);
   
               if (tcp->th_flags & TH_RST)       /* No TCP reset packets */                if (tcp->th_flags & TH_RST)       /* No TCP reset packets */
                 return(0);                  return(0);
Line 1453  IfaceIsDemand(int proto, Mbuf pkt) Line 1513  IfaceIsDemand(int proto, Mbuf pkt)
  */   */
   
 static int  static int
IfaceSetCommand(Context ctx, int ac, char *av[], void *arg)IfaceSetCommand(Context ctx, int ac, const char *const av[], const void *arg)
 {  {
   IfaceState    const iface = &ctx->bund->iface;    IfaceState    const iface = &ctx->bund->iface;
   int           empty_arg;    int           empty_arg;
Line 1486  IfaceSetCommand(Context ctx, int ac, char *av[], void  Line 1546  IfaceSetCommand(Context ctx, int ac, char *av[], void 
         struct u_range  self_addr;          struct u_range  self_addr;
         struct u_addr   peer_addr;          struct u_addr   peer_addr;
         int     self_addr_force = 0, peer_addr_force = 0;          int     self_addr_force = 0, peer_addr_force = 0;
        char    *arg;        const char   *arg1;
   
         /* Parse */          /* Parse */
         if (ac != 2)          if (ac != 2)
           return(-1);            return(-1);
        arg = av[0];        arg1 = av[0];
        if (arg[0] == '!') {        if (arg1[0] == '!') {
             self_addr_force = 1;              self_addr_force = 1;
            arg++;            arg1++;
         }          }
        if (!ParseRange(arg, &self_addr, ALLOW_IPV4|ALLOW_IPV6))        if (!ParseRange(arg1, &self_addr, ALLOW_IPV4|ALLOW_IPV6))
           Error("Bad IP address \"%s\"", av[0]);            Error("Bad IP address \"%s\"", av[0]);
        arg = av[1];        arg1 = av[1];
        if (arg[0] == '!') {        if (arg1[0] == '!') {
             peer_addr_force = 1;              peer_addr_force = 1;
            arg++;            arg1++;
         }          }
        if (!ParseAddr(arg, &peer_addr, ALLOW_IPV4|ALLOW_IPV6))        if (!ParseAddr(arg1, &peer_addr, ALLOW_IPV4|ALLOW_IPV6))
           Error("Bad IP address \"%s\"", av[1]);            Error("Bad IP address \"%s\"", av[1]);
         if (self_addr.addr.family != peer_addr.family)          if (self_addr.addr.family != peer_addr.family)
           Error("Addresses must be from the same protocol family");            Error("Addresses must be from the same protocol family");
Line 1549  IfaceSetCommand(Context ctx, int ac, char *av[], void  Line 1609  IfaceSetCommand(Context ctx, int ac, char *av[], void 
     case SET_MTU:      case SET_MTU:
       {        {
         int     max_mtu;          int     max_mtu;
           int     override;
   
         /* Check */          /* Check */
        if (ac != 1)        if (ac < 1 || ac > 2)
           return(-1);            return(-1);
   
         max_mtu = atoi(av[0]);          max_mtu = atoi(av[0]);
           override = 0;
   
           if (ac == 2 && av[1][0]) {
             if (strcmp(av[1], "override") == 0)
               override = 1;
             else
               Error("Invalid keyword %s", av[1]);
           }
           
         if (max_mtu < IFACE_MIN_MTU || max_mtu > IFACE_MAX_MTU)          if (max_mtu < IFACE_MIN_MTU || max_mtu > IFACE_MAX_MTU)
          Error("Invalid interface mtu %d", max_mtu);          if (!override || max_mtu != 0)
        iface->max_mtu = max_mtu;            Error("Invalid interface mtu %d", max_mtu);
 
         if (max_mtu != 0)
           iface->max_mtu = max_mtu;
         if (override)
           iface->mtu_override = max_mtu;
       }        }
       break;        break;
   
Line 1572  IfaceSetCommand(Context ctx, int ac, char *av[], void  Line 1647  IfaceSetCommand(Context ctx, int ac, char *av[], void 
             break;              break;
           case 1:            case 1:
             if (strcmp(iface->ifname, av[0]) != 0) {              if (strcmp(iface->ifname, av[0]) != 0) {
                int ifmaxlen = IF_NAMESIZE - ctx->bund->tmpl * IFNUMLEN;                unsigned ifmaxlen = IF_NAMESIZE - ctx->bund->tmpl * IFNUMLEN;
                 if (strlen(av[0]) >= ifmaxlen)                  if (strlen(av[0]) >= ifmaxlen)
                    Error("Interface name too long, >%d characters", ifmaxlen-1);                    Error("Interface name too long, >%u characters", ifmaxlen-1);
                 if ((strncmp(av[0], "ng", 2) == 0) &&                  if ((strncmp(av[0], "ng", 2) == 0) &&
                   ((ctx->bund->tmpl && av[0][2] == 0) ||                    ((ctx->bund->tmpl && av[0][2] == 0) ||
                   (av[0][2] >= '0' && av[0][2] <= '9')))                    (av[0][2] >= '0' && av[0][2] <= '9')))
Line 1663  IfaceSetCommand(Context ctx, int ac, char *av[], void  Line 1738  IfaceSetCommand(Context ctx, int ac, char *av[], void 
  */   */
   
 int  int
IfaceStat(Context ctx, int ac, char *av[], void *arg)IfaceStat(Context ctx, int ac, const char *const av[], const void *arg)
 {  {
     Bund        const b = ctx->bund;      Bund        const b = ctx->bund;
     IfaceState  const iface = &b->iface;      IfaceState  const iface = &b->iface;
Line 1676  IfaceStat(Context ctx, int ac, char *av[], void *arg) Line 1751  IfaceStat(Context ctx, int ac, char *av[], void *arg)
     struct acl  *a;      struct acl  *a;
 #endif  #endif
   
       (void)ac;
       (void)av;
       (void)arg;
   
     Printf("Interface configuration:\r\n");      Printf("Interface configuration:\r\n");
     Printf("\tName            : %s\r\n", iface->conf.ifname);      Printf("\tName            : %s\r\n", iface->conf.ifname);
 #ifdef SIOCSIFDESCR  #ifdef SIOCSIFDESCR
Line 1686  IfaceStat(Context ctx, int ac, char *av[], void *arg) Line 1765  IfaceStat(Context ctx, int ac, char *av[], void *arg)
     Printf("\tGroup           : %s\r\n", iface->conf.ifgroup);      Printf("\tGroup           : %s\r\n", iface->conf.ifgroup);
 #endif  #endif
     Printf("\tMaximum MTU     : %d bytes\r\n", iface->max_mtu);      Printf("\tMaximum MTU     : %d bytes\r\n", iface->max_mtu);
       Printf("\tMTU override    : %d bytes\r\n", iface->mtu_override);
     Printf("\tIdle timeout    : %d seconds\r\n", iface->idle_timeout);      Printf("\tIdle timeout    : %d seconds\r\n", iface->idle_timeout);
     Printf("\tSession timeout : %d seconds\r\n", iface->session_timeout);      Printf("\tSession timeout : %d seconds\r\n", iface->session_timeout);
     if (!u_rangeempty(&iface->conf.self_addr)) {      if (!u_rangeempty(&iface->conf.self_addr)) {
Line 1811  IfaceSetMTU(Bund b, int mtu) Line 1891  IfaceSetMTU(Bund b, int mtu)
     int                 s;      int                 s;
   
     /* Get socket */      /* Get socket */
    if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {    if ((s = socket(PF_LOCAL, SOCK_DGRAM, 0)) < 0) {
         Perror("[%s] IFACE: Can't get socket to set MTU", b->name);          Perror("[%s] IFACE: Can't get socket to set MTU", b->name);
         return;          return;
     }      }
   
    if ((b->params.mtu > 0) && (mtu > b->params.mtu)) {    if (!iface->mtu_override && (b->params.mtu > 0) && (mtu > b->params.mtu)) {
         mtu = b->params.mtu;          mtu = b->params.mtu;
         Log(LG_IFACE2, ("[%s] IFACE: forcing MTU of auth backend: %d bytes",          Log(LG_IFACE2, ("[%s] IFACE: forcing MTU of auth backend: %d bytes",
             b->name, mtu));              b->name, mtu));
     }      }
   
    /* Limit MTU to configured maximum */    /* Limit MTU to configured maximum/override */
    if (mtu > iface->max_mtu)    if (iface->mtu_override) {
         mtu = iface->mtu_override;
         Log(LG_IFACE2, ("[%s] IFACE: forcing MTU override: %d bytes",
             b->name, mtu));
     } else if (mtu > iface->max_mtu)
         mtu = iface->max_mtu;          mtu = iface->max_mtu;
   
     /* Set MTU on interface */      /* Set MTU on interface */
Line 1856  IfaceChangeFlags(Bund b, int clear, int set) Line 1940  IfaceChangeFlags(Bund b, int clear, int set)
     Log(LG_IFACE2, ("[%s] IFACE: Change interface %s flags: -%d +%d",      Log(LG_IFACE2, ("[%s] IFACE: Change interface %s flags: -%d +%d",
         b->name, b->iface.ifname, clear, set));          b->name, b->iface.ifname, clear, set));
   
    if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {    if ((s = socket(PF_LOCAL, SOCK_DGRAM, 0)) < 0) {
         Perror("[%s] IFACE: Can't get socket to change interface flags", b->name);          Perror("[%s] IFACE: Can't get socket to change interface flags", b->name);
         return;          return;
     }      }
Line 1864  IfaceChangeFlags(Bund b, int clear, int set) Line 1948  IfaceChangeFlags(Bund b, int clear, int set)
     memset(&ifrq, '\0', sizeof(ifrq));      memset(&ifrq, '\0', sizeof(ifrq));
     strlcpy(ifrq.ifr_name, b->iface.ifname, sizeof(ifrq.ifr_name));      strlcpy(ifrq.ifr_name, b->iface.ifname, sizeof(ifrq.ifr_name));
     if (ioctl(s, SIOCGIFFLAGS, &ifrq) < 0) {      if (ioctl(s, SIOCGIFFLAGS, &ifrq) < 0) {
        Perror("[%s] IFACE: ioctl(SIOCGIFFLAGS, %s)", b->name, b->iface.ifname);        Perror("[%s] IFACE: ioctl(%s, %s)", b->name, b->iface.ifname, "SIOCGIFFLAGS");
         close(s);          close(s);
         return;          return;
     }      }
Line 1877  IfaceChangeFlags(Bund b, int clear, int set) Line 1961  IfaceChangeFlags(Bund b, int clear, int set)
     ifrq.ifr_flagshigh = new_flags >> 16;      ifrq.ifr_flagshigh = new_flags >> 16;
   
     if (ioctl(s, SIOCSIFFLAGS, &ifrq) < 0) {      if (ioctl(s, SIOCSIFFLAGS, &ifrq) < 0) {
        Perror("[%s] IFACE: ioctl(SIOCSIFFLAGS, %s)", b->name, b->iface.ifname);        Perror("[%s] IFACE: ioctl(%s, %s)", b->name, b->iface.ifname, "SIOCSIFFLAGS");
         close(s);          close(s);
         return;          return;
     }      }
Line 1892  add_scope(struct sockaddr *sa, int ifindex) Line 1976  add_scope(struct sockaddr *sa, int ifindex)
   
   if (sa->sa_family != AF_INET6)    if (sa->sa_family != AF_INET6)
     return;      return;
  sa6 = (struct sockaddr_in6 *)sa;  sa6 = (struct sockaddr_in6 *)(void *)sa;
   if (!IN6_IS_ADDR_LINKLOCAL(&sa6->sin6_addr) &&    if (!IN6_IS_ADDR_LINKLOCAL(&sa6->sin6_addr) &&
       !IN6_IS_ADDR_MC_LINKLOCAL(&sa6->sin6_addr))        !IN6_IS_ADDR_MC_LINKLOCAL(&sa6->sin6_addr))
     return;      return;
Line 1932  IfaceChangeAddr(Bund b, int add, struct u_range *self, Line 2016  IfaceChangeAddr(Bund b, int add, struct u_range *self,
         memset(&ifra, '\0', sizeof(ifra));          memset(&ifra, '\0', sizeof(ifra));
         strlcpy(ifra.ifra_name, b->iface.ifname, sizeof(ifra.ifra_name));          strlcpy(ifra.ifra_name, b->iface.ifname, sizeof(ifra.ifra_name));
   
        me4 = (struct sockaddr_in *)&ifra.ifra_addr;        me4 = (struct sockaddr_in *)(void *)&ifra.ifra_addr;
         memcpy(me4, &ssself, sizeof(*me4));          memcpy(me4, &ssself, sizeof(*me4));
   
        msk4 = (struct sockaddr_in *)&ifra.ifra_mask;        msk4 = (struct sockaddr_in *)(void *)&ifra.ifra_mask;
         memcpy(msk4, &ssmsk, sizeof(*msk4));          memcpy(msk4, &ssmsk, sizeof(*msk4));
   
        peer4 = (struct sockaddr_in *)&ifra.ifra_broadaddr;        peer4 = (struct sockaddr_in *)(void *)&ifra.ifra_broadaddr;
         if (peer == NULL || peer->family == AF_UNSPEC) {          if (peer == NULL || peer->family == AF_UNSPEC) {
             peer4->sin_family = AF_INET;              peer4->sin_family = AF_INET;
             peer4->sin_len = sizeof(*peer4);              peer4->sin_len = sizeof(*peer4);
Line 2089  IfaceCorrectMSS(Mbuf pkt, uint16_t maxmss) Line 2173  IfaceCorrectMSS(Mbuf pkt, uint16_t maxmss)
   if (pkt == NULL)    if (pkt == NULL)
     return;      return;
   
  iphdr = (struct ip *)MBDATAU(pkt);  iphdr = (struct ip *)(void *)MBDATAU(pkt);
   hlen = iphdr->ip_hl << 2;    hlen = iphdr->ip_hl << 2;
   pktlen = MBLEN(pkt) - hlen;    pktlen = MBLEN(pkt) - hlen;
  tc = (struct tcphdr *)(MBDATAU(pkt) + hlen);  tc = (struct tcphdr *)(void *)(MBDATAU(pkt) + hlen);
   hlen = tc->th_off << 2;    hlen = tc->th_off << 2;
   
   /* Invalid header length or header without options. */    /* Invalid header length or header without options. */
Line 2116  IfaceCorrectMSS(Mbuf pkt, uint16_t maxmss) Line 2200  IfaceCorrectMSS(Mbuf pkt, uint16_t maxmss)
       if (*opt == TCPOPT_MAXSEG) {        if (*opt == TCPOPT_MAXSEG) {
         if (optlen != TCPOLEN_MAXSEG)          if (optlen != TCPOLEN_MAXSEG)
           continue;            continue;
        mss = (u_int16_t *)(opt + 2);        mss = (u_int16_t *)(void *)(opt + 2);
         if (ntohs(*mss) > maxmss) {          if (ntohs(*mss) > maxmss) {
           accumulate = *mss;            accumulate = *mss;
           *mss = htons(maxmss);            *mss = htons(maxmss);
Line 2177  IfaceNgIpInit(Bund b, int ready) Line 2261  IfaceNgIpInit(Bund b, int ready)
         if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN) ||          if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN) ||
             Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)) {              Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)) {
             if (IfaceInitNetflow(b, path, hook,               if (IfaceInitNetflow(b, path, hook, 
                 Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN)?1:0,  
                 Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)?1:0, 0))                  Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)?1:0, 0))
                 goto fail;                  goto fail;
             if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN))              if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN))
Line 2188  IfaceNgIpInit(Bund b, int ready) Line 2271  IfaceNgIpInit(Bund b, int ready)
 #else   /* NG_NETFLOW_CONF_INGRESS */  #else   /* NG_NETFLOW_CONF_INGRESS */
         /* Connect a netflow node if configured */          /* Connect a netflow node if configured */
         if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN)) {          if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN)) {
            if (IfaceInitNetflow(b, path, hook, 1, 0, 0))            if (IfaceInitNetflow(b, path, hook, 0, 0))
                 goto fail;                  goto fail;
             b->iface.nfin_up = 1;              b->iface.nfin_up = 1;
         }          }
   
         if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)) {          if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)) {
            if (IfaceInitNetflow(b, path, hook, 0, 1, 0))            if (IfaceInitNetflow(b, path, hook, 1, 0))
                 goto fail;                  goto fail;
             b->iface.nfout_up = 1;              b->iface.nfout_up = 1;
         }          }
Line 2282  IfaceNgIpShutdown(Bund b) Line 2365  IfaceNgIpShutdown(Bund b)
 #ifdef USE_NG_NETFLOW  #ifdef USE_NG_NETFLOW
 #ifdef NG_NETFLOW_CONF_INGRESS  #ifdef NG_NETFLOW_CONF_INGRESS
     if (b->iface.nfin_up || b->iface.nfout_up)      if (b->iface.nfin_up || b->iface.nfout_up)
        IfaceShutdownNetflow(b, b->iface.nfin_up, b->iface.nfout_up, 0);        IfaceShutdownNetflow(b, b->iface.nfout_up, 0);
     b->iface.nfin_up = 0;      b->iface.nfin_up = 0;
     b->iface.nfout_up = 0;      b->iface.nfout_up = 0;
 #else /* NG_NETFLOW_CONF_INGRESS */  #else /* NG_NETFLOW_CONF_INGRESS */
     if (b->iface.nfin_up)      if (b->iface.nfin_up)
        IfaceShutdownNetflow(b, 1, 0, 0);        IfaceShutdownNetflow(b, 0, 0);
     b->iface.nfin_up = 0;      b->iface.nfin_up = 0;
     if (b->iface.nfout_up)      if (b->iface.nfout_up)
        IfaceShutdownNetflow(b, 0, 1, 0);        IfaceShutdownNetflow(b, 1, 0);
     b->iface.nfout_up = 0;      b->iface.nfout_up = 0;
 #endif /* NG_NETFLOW_CONF_INGRESS */  #endif /* NG_NETFLOW_CONF_INGRESS */
 #endif  #endif
Line 2341  IfaceNgIpv6Init(Bund b, int ready) Line 2424  IfaceNgIpv6Init(Bund b, int ready)
         if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN) ||          if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN) ||
             Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)) {              Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)) {
             if (IfaceInitNetflow(b, path, hook,               if (IfaceInitNetflow(b, path, hook, 
                 Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN)?1:0,  
                 Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)?1:0, 1))                  Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)?1:0, 1))
                 goto fail;                  goto fail;
             if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN))              if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN))
Line 2352  IfaceNgIpv6Init(Bund b, int ready) Line 2434  IfaceNgIpv6Init(Bund b, int ready)
 #else   /* NG_NETFLOW_CONF_INGRESS */  #else   /* NG_NETFLOW_CONF_INGRESS */
         /* Connect a netflow node if configured */          /* Connect a netflow node if configured */
         if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN)) {          if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_IN)) {
            if (IfaceInitNetflow(b, path, hook, 1, 0, 1))            if (IfaceInitNetflow(b, path, hook, 0, 1))
                 goto fail;                  goto fail;
             b->iface.nfin_up = 1;              b->iface.nfin_up = 1;
         }          }
   
         if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)) {          if (Enabled(&b->iface.options, IFACE_CONF_NETFLOW_OUT)) {
            if (IfaceInitNetflow(b, path, hook, 0, 1, 1))            if (IfaceInitNetflow(b, path, hook, 1, 1))
                 goto fail;                  goto fail;
             b->iface.nfout_up = 1;              b->iface.nfout_up = 1;
         }          }
Line 2426  IfaceNgIpv6Shutdown(Bund b) Line 2508  IfaceNgIpv6Shutdown(Bund b)
 #ifdef USE_NG_NETFLOW  #ifdef USE_NG_NETFLOW
 #ifdef NG_NETFLOW_CONF_INGRESS  #ifdef NG_NETFLOW_CONF_INGRESS
     if (b->iface.nfin_up || b->iface.nfout_up)      if (b->iface.nfin_up || b->iface.nfout_up)
        IfaceShutdownNetflow(b, b->iface.nfin_up, b->iface.nfout_up, 1);        IfaceShutdownNetflow(b, b->iface.nfout_up, 1);
     b->iface.nfin_up = 0;      b->iface.nfin_up = 0;
     b->iface.nfout_up = 0;      b->iface.nfout_up = 0;
 #else /* NG_NETFLOW_CONF_INGRESS */  #else /* NG_NETFLOW_CONF_INGRESS */
     if (b->iface.nfin_up)      if (b->iface.nfin_up)
        IfaceShutdownNetflow(b, 1, 0, 1);        IfaceShutdownNetflow(b, 0, 1);
     b->iface.nfin_up = 0;      b->iface.nfin_up = 0;
     if (b->iface.nfout_up)      if (b->iface.nfout_up)
        IfaceShutdownNetflow(b, 0, 1, 1);        IfaceShutdownNetflow(b, 1, 1);
     b->iface.nfout_up = 0;      b->iface.nfout_up = 0;
 #endif /* NG_NETFLOW_CONF_INGRESS */  #endif /* NG_NETFLOW_CONF_INGRESS */
 #endif  #endif
Line 2763  IfaceShutdownIpacct(Bund b) Line 2845  IfaceShutdownIpacct(Bund b)
   
 #ifdef USE_NG_NETFLOW  #ifdef USE_NG_NETFLOW
 static int  static int
IfaceInitNetflow(Bund b, char *path, char *hook, char in, char out, int v6)IfaceInitNetflow(Bund b, char *path, char *hook, char out, int v6)
 {  {
     struct ngm_connect  cn;      struct ngm_connect  cn;
     int nif;      int nif;
Line 2877  fail: Line 2959  fail:
 }  }
   
 static void  static void
IfaceShutdownNetflow(Bund b, char in, char out, int v6)IfaceShutdownNetflow(Bund b, char out, int v6)
 {  {
     char        path[NG_PATHSIZ];      char        path[NG_PATHSIZ];
     char        hook[NG_HOOKSIZ];      char        hook[NG_HOOKSIZ];
     int nif;      int nif;
   
 #ifdef NG_NETFLOW_CONF_INGRESS  #ifdef NG_NETFLOW_CONF_INGRESS
       (void)out;
     nif = gNetflowIface + b->id*2;      nif = gNetflowIface + b->id*2;
 #else  #else
     nif = gNetflowIface + b->id*4 + out*2;      nif = gNetflowIface + b->id*4 + out*2;
Line 3004  IfaceSetupMSS(Bund b, uint16_t maxMSS) Line 3087  IfaceSetupMSS(Bund b, uint16_t maxMSS)
   memset(&tcpmsscfg, 0, sizeof(tcpmsscfg));    memset(&tcpmsscfg, 0, sizeof(tcpmsscfg));
   tcpmsscfg.maxMSS = maxMSS;    tcpmsscfg.maxMSS = maxMSS;
   
     Log(LG_IFACE2, ("[%s] IFACE: Configuring ng_tcpmss %s %u",
         b->name, path, (unsigned)tcpmsscfg.maxMSS));
   
   snprintf(tcpmsscfg.inHook, sizeof(tcpmsscfg.inHook), "in");    snprintf(tcpmsscfg.inHook, sizeof(tcpmsscfg.inHook), "in");
   snprintf(tcpmsscfg.outHook, sizeof(tcpmsscfg.outHook), "out");    snprintf(tcpmsscfg.outHook, sizeof(tcpmsscfg.outHook), "out");
   if (NgSendMsg(gLinksCsock, path, NGM_TCPMSS_COOKIE, NGM_TCPMSS_CONFIG,    if (NgSendMsg(gLinksCsock, path, NGM_TCPMSS_COOKIE, NGM_TCPMSS_CONFIG,
Line 3672  IfaceSetName(Bund b, const char * ifname) Line 3758  IfaceSetName(Bund b, const char * ifname)
         return(0);          return(0);
   
     /* Get socket */      /* Get socket */
    if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {    if ((s = socket(PF_LOCAL, SOCK_DGRAM, 0)) < 0) {
         Perror("[%s] IFACE: Can't get socket to set name", b->name);          Perror("[%s] IFACE: Can't get socket to set name", b->name);
         return(-1);          return(-1);
     }      }
Line 3680  IfaceSetName(Bund b, const char * ifname) Line 3766  IfaceSetName(Bund b, const char * ifname)
     /* Set name of interface */      /* Set name of interface */
     memset(&ifr, 0, sizeof(ifr));      memset(&ifr, 0, sizeof(ifr));
     strlcpy(ifr.ifr_name, iface->ifname, sizeof(ifr.ifr_name));      strlcpy(ifr.ifr_name, iface->ifname, sizeof(ifr.ifr_name));
    ifr.ifr_data = (caddr_t)ifname;
 #ifdef __clang__
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wcast-qual"
 #endif
     ifr.ifr_data = (char *)ifname;
 #ifdef __clang__
 #pragma clang diagnostic pop
 #endif
 
     Log(LG_IFACE2, ("[%s] IFACE: setting \"%s\" name to \"%s\"",      Log(LG_IFACE2, ("[%s] IFACE: setting \"%s\" name to \"%s\"",
         b->name, iface->ifname, ifname));          b->name, iface->ifname, ifname));
   
     if (ioctl(s, SIOCSIFNAME, (caddr_t)&ifr) < 0) {      if (ioctl(s, SIOCSIFNAME, (caddr_t)&ifr) < 0) {
         if (errno != EEXIST) {          if (errno != EEXIST) {
            Perror("[%s] IFACE: ioctl(%s, SIOCSIFNAME)", b->name, iface->ifname);            Perror("[%s] IFACE: ioctl(%s, %s)", b->name, iface->ifname, "SIOCSIFNAME");
             close(s);              close(s);
             return(-1);              return(-1);
         }          }
Line 3745  IfaceSetDescr(Bund b, const char * template) Line 3840  IfaceSetDescr(Bund b, const char * template)
      */       */
     if (mib[0] < 0 && sysctlnametomib("net.ifdescr_maxlen", mib, &miblen) < 0) {      if (mib[0] < 0 && sysctlnametomib("net.ifdescr_maxlen", mib, &miblen) < 0) {
       mib[0] = 0;        mib[0] = 0;
      Perror("[%s] IFACE: sysctl net.ifdescr_maxlen  failed", b->name);      Perror("[%s] IFACE: sysctl net.ifdescr_maxlen failed", b->name);
     }      }
   
     /*      /*
Line 3842  IfaceSetDescr(Bund b, const char * template) Line 3937  IfaceSetDescr(Bund b, const char * template)
           /* peer MAC address */            /* peer MAC address */
           case 'M':            case 'M':
             if (b->links[0]) {              if (b->links[0]) {
              PhysType const pt = b->links[0]->type;              const struct phystype * pt = b->links[0]->type;
               if (pt && pt->peermacaddr) {                if (pt && pt->peermacaddr) {
                 (*pt->peermacaddr)(b->links[0], buf, sizeof(buf));                  (*pt->peermacaddr)(b->links[0], buf, sizeof(buf));
                 DST_COPY(buf);                  DST_COPY(buf);
Line 3853  IfaceSetDescr(Bund b, const char * template) Line 3948  IfaceSetDescr(Bund b, const char * template)
                 DST_COPY("-");                  DST_COPY("-");
             }              }
             break;              break;
          /* local "physycal" address */          /* local "physical" address */
           case 'o':            case 'o':
             if (b->links[0] && PhysGetSelfAddr(b->links[0], buf, sizeof(buf)) == 0) {              if (b->links[0] && PhysGetSelfAddr(b->links[0], buf, sizeof(buf)) == 0) {
                 DST_COPY(buf);                  DST_COPY(buf);
Line 3861  IfaceSetDescr(Bund b, const char * template) Line 3956  IfaceSetDescr(Bund b, const char * template)
                 DST_COPY("-");                  DST_COPY("-");
             }              }
             break;              break;
          /* peer "physycal" address */          /* peer "physical" address */
           case 'O':            case 'O':
             if (b->links[0] && PhysGetPeerAddr(b->links[0], buf, sizeof(buf)) == 0) {              if (b->links[0] && PhysGetPeerAddr(b->links[0], buf, sizeof(buf)) == 0) {
                 DST_COPY(buf);                  DST_COPY(buf);
Line 3924  IfaceSetDescr(Bund b, const char * template) Line 4019  IfaceSetDescr(Bund b, const char * template)
         return(0);              /* we have not set system interface name yet */          return(0);              /* we have not set system interface name yet */
   
     /* Get socket */      /* Get socket */
    if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {    if ((s = socket(PF_LOCAL, SOCK_DGRAM, 0)) < 0) {
         Perror("[%s] IFACE: Can't get socket to set description for %s",          Perror("[%s] IFACE: Can't get socket to set description for %s",
                 b->name, ifname);                  b->name, ifname);
         return(-1);          return(-1);
Line 3977  IfaceAddGroup(Bund b, const char * ifgroup) Line 4072  IfaceAddGroup(Bund b, const char * ifgroup)
     }      }
   
     /* Get socket */      /* Get socket */
    if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {    if ((s = socket(PF_LOCAL, SOCK_DGRAM, 0)) < 0) {
         Perror("[%s] IFACE: Can't get socket to add group", b->name);          Perror("[%s] IFACE: Can't get socket to add group", b->name);
         return(-1);          return(-1);
     }      }
Line 3992  IfaceAddGroup(Bund b, const char * ifgroup) Line 4087  IfaceAddGroup(Bund b, const char * ifgroup)
   
     i = ioctl(s, SIOCAIFGROUP, (caddr_t)&ifgr);      i = ioctl(s, SIOCAIFGROUP, (caddr_t)&ifgr);
     if (i < 0 && i != EEXIST) {      if (i < 0 && i != EEXIST) {
        Perror("[%s] IFACE: ioctl(%s, SIOCAIFGROUP)", b->name, iface->ifname);        Perror("[%s] IFACE: ioctl(%s, %s)", b->name, iface->ifname, "SIOCAIFGROUP");
         close(s);          close(s);
         return(-1);          return(-1);
     }      }
Line 4012  IfaceDelGroup(Bund b, const char * ifgroup) Line 4107  IfaceDelGroup(Bund b, const char * ifgroup)
     int s;      int s;
   
     /* Get socket */      /* Get socket */
    if ((s = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {    if ((s = socket(PF_LOCAL, SOCK_DGRAM, 0)) < 0) {
         Perror("[%s] IFACE: Can't get socket to delete from group", b->name);          Perror("[%s] IFACE: Can't get socket to delete from group", b->name);
         return(-1);          return(-1);
     }      }
Line 4031  IfaceDelGroup(Bund b, const char * ifgroup) Line 4126  IfaceDelGroup(Bund b, const char * ifgroup)
         b->name, iface->ifname, ifgroup));          b->name, iface->ifname, ifgroup));
   
     if (ioctl(s, SIOCDIFGROUP, (caddr_t)&ifgr) == -1) {      if (ioctl(s, SIOCDIFGROUP, (caddr_t)&ifgr) == -1) {
        Perror("[%s] IFACE: ioctl(%s, SIOCDIFGROUP)", b->name, iface->ifname);        Perror("[%s] IFACE: ioctl(%s, %s)", b->name, iface->ifname, "SIOCDIFGROUP");
         close(s);          close(s);
         return(-1);          return(-1);
     }      }

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


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