Author: melifaro
Date: Mon Sep 24 17:31:08 2012
New Revision: 240892
URL: http://svn.freebsd.org/changeset/base/240892

Log:
  Permit table to be used as IPv6 address.
  
  Reported by:  Serhiy Popov <sergius...@ukr.net>
  MFC after:    2 weeks

Modified:
  head/sbin/ipfw/ipv6.c

Modified: head/sbin/ipfw/ipv6.c
==============================================================================
--- head/sbin/ipfw/ipv6.c       Mon Sep 24 17:13:33 2012        (r240891)
+++ head/sbin/ipfw/ipv6.c       Mon Sep 24 17:31:08 2012        (r240892)
@@ -352,6 +352,22 @@ fill_ip6(ipfw_insn_ip6 *cmd, char *av)
               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) {
                /*
@@ -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) ==
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to