Author: melifaro
Date: Mon Oct 22 12:39:57 2012
New Revision: 241883
URL: http://svn.freebsd.org/changeset/base/241883

Log:
  Merge r240892,r240893
  
  Permit table to be used as IPv6 address.
  Whitespace fixes
  
  Reported by:  Serhiy Popov <[email protected]>

Modified:
  stable/9/sbin/ipfw/ipv6.c
Directory Properties:
  stable/9/sbin/   (props changed)
  stable/9/sbin/ipfw/   (props changed)

Modified: stable/9/sbin/ipfw/ipv6.c
==============================================================================
--- stable/9/sbin/ipfw/ipv6.c   Mon Oct 22 12:22:56 2012        (r241882)
+++ stable/9/sbin/ipfw/ipv6.c   Mon Oct 22 12:39:57 2012        (r241883)
@@ -336,24 +336,40 @@ fill_ip6(ipfw_insn_ip6 *cmd, char *av)
         * Note d[1] points to struct in6_add r mask6 of cmd
         */
 
-       cmd->o.len &= ~F_LEN_MASK;      /* zero len */
+       cmd->o.len &= ~F_LEN_MASK;      /* zero len */
 
-       if (strcmp(av, "any") == 0)
-              return (1);
+       if (strcmp(av, "any") == 0)
+               return (1);
 
 
-       if (strcmp(av, "me") == 0) {    /* Set the data for "me" opt*/
-              cmd->o.len |= F_INSN_SIZE(ipfw_insn);
-              return (1);
-       }
+       if (strcmp(av, "me") == 0) {    /* Set the data for "me" opt*/
+               cmd->o.len |= F_INSN_SIZE(ipfw_insn);
+               return (1);
+       }
+
+       if (strcmp(av, "me6") == 0) {   /* Set the data for "me" opt*/
+               cmd->o.len |= F_INSN_SIZE(ipfw_insn);
+               return (1);
+       }
 
-       if (strcmp(av, "me6") == 0) {   /* Set the data for "me" opt*/
-              cmd->o.len |= F_INSN_SIZE(ipfw_insn);
-              return (1);
-       }
+       if (strncmp(av, "table(", 6) == 0) {
+               char *p = strchr(av + 6, ',');
+               uint32_t *dm = ((ipfw_insn_u32 *)cmd)->d;
+
+               if (p)
+                       *p++ = '\0';
+               cmd->o.opcode = O_IP_DST_LOOKUP;
+               cmd->o.arg1 = strtoul(av + 6, NULL, 0);
+               if (p) {
+                       cmd->o.len |= F_INSN_SIZE(ipfw_insn_u32);
+                       dm[0] = strtoul(p, NULL, 0);
+               } else
+                       cmd->o.len |= F_INSN_SIZE(ipfw_insn);
+               return (1);
+       }
 
-       av = strdup(av);
-       while (av) {
+       av = strdup(av);
+       while (av) {
                /*
                 * After the address we can have '/' indicating a mask,
                 * or ',' indicating another address follows.
@@ -469,7 +485,11 @@ add_srcip6(ipfw_insn *cmd, char *av)
 {
 
        fill_ip6((ipfw_insn_ip6 *)cmd, av);
-       if (F_LEN(cmd) == 0) {                          /* any */
+       if (cmd->opcode == O_IP_DST_SET)                        /* set */
+               cmd->opcode = O_IP_SRC_SET;
+       else if (cmd->opcode == O_IP_DST_LOOKUP)                /* table */
+               cmd->opcode = O_IP_SRC_LOOKUP;
+       else if (F_LEN(cmd) == 0) {                             /* any */
        } else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn)) {      /* "me" */
                cmd->opcode = O_IP6_SRC_ME;
        } else if (F_LEN(cmd) ==
@@ -487,7 +507,11 @@ add_dstip6(ipfw_insn *cmd, char *av)
 {
 
        fill_ip6((ipfw_insn_ip6 *)cmd, av);
-       if (F_LEN(cmd) == 0) {                          /* any */
+       if (cmd->opcode == O_IP_DST_SET)                        /* set */
+               ;
+       else if (cmd->opcode == O_IP_DST_LOOKUP)                /* table */
+               ;
+       else if (F_LEN(cmd) == 0) {                             /* any */
        } else if (F_LEN(cmd) == F_INSN_SIZE(ipfw_insn)) {      /* "me" */
                cmd->opcode = O_IP6_DST_ME;
        } else if (F_LEN(cmd) ==
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "[email protected]"

Reply via email to