svn commit: r190633 - in head: sbin/ipfw sys sys/amd64/include/xen
sys/arm/arm sys/contrib/pf sys/dev/ata sys/dev/cxgb
sys/dev/sound/usb sys/dev/usb sys/dev/usb/bluetooth
sys/dev/usb/controller sys...
Paolo Pisati
piso at FreeBSD.org
Wed Apr 1 13:23:48 PDT 2009
Author: piso
Date: Wed Apr 1 20:23:47 2009
New Revision: 190633
URL: http://svn.freebsd.org/changeset/base/190633
Log:
Implement an ipfw action to reassemble ip packets: reass.
Modified:
head/sbin/ipfw/ (props changed)
head/sbin/ipfw/ipfw.8
head/sbin/ipfw/ipfw2.c
head/sbin/ipfw/ipfw2.h
head/sbin/ipfw/main.c
head/sys/ (props changed)
head/sys/amd64/include/xen/ (props changed)
head/sys/arm/arm/cpufunc_asm_sheeva.S (props changed)
head/sys/contrib/pf/ (props changed)
head/sys/dev/ata/ata-usb.c (props changed)
head/sys/dev/cxgb/ (props changed)
head/sys/dev/sound/usb/uaudio.c (props changed)
head/sys/dev/sound/usb/uaudio.h (props changed)
head/sys/dev/sound/usb/uaudio_pcm.c (props changed)
head/sys/dev/sound/usb/uaudioreg.h (props changed)
head/sys/dev/usb/README.TXT (props changed)
head/sys/dev/usb/bluetooth/TODO.TXT (props changed)
head/sys/dev/usb/bluetooth/ng_ubt.c (props changed)
head/sys/dev/usb/bluetooth/ng_ubt_var.h (props changed)
head/sys/dev/usb/bluetooth/ubtbcmfw.c (props changed)
head/sys/dev/usb/controller/at91dci.c (props changed)
head/sys/dev/usb/controller/at91dci.h (props changed)
head/sys/dev/usb/controller/at91dci_atmelarm.c (props changed)
head/sys/dev/usb/controller/atmegadci.c (props changed)
head/sys/dev/usb/controller/atmegadci.h (props changed)
head/sys/dev/usb/controller/atmegadci_atmelarm.c (props changed)
head/sys/dev/usb/controller/ehci.c (props changed)
head/sys/dev/usb/controller/ehci.h (props changed)
head/sys/dev/usb/controller/ehci_ixp4xx.c (props changed)
head/sys/dev/usb/controller/ehci_mbus.c (props changed)
head/sys/dev/usb/controller/ehci_pci.c (props changed)
head/sys/dev/usb/controller/musb_otg.c (props changed)
head/sys/dev/usb/controller/musb_otg.h (props changed)
head/sys/dev/usb/controller/musb_otg_atmelarm.c (props changed)
head/sys/dev/usb/controller/ohci.c (props changed)
head/sys/dev/usb/controller/ohci.h (props changed)
head/sys/dev/usb/controller/ohci_atmelarm.c (props changed)
head/sys/dev/usb/controller/ohci_pci.c (props changed)
head/sys/dev/usb/controller/uhci.c (props changed)
head/sys/dev/usb/controller/uhci.h (props changed)
head/sys/dev/usb/controller/uhci_pci.c (props changed)
head/sys/dev/usb/controller/usb_controller.c (props changed)
head/sys/dev/usb/controller/uss820dci.c (props changed)
head/sys/dev/usb/controller/uss820dci.h (props changed)
head/sys/dev/usb/controller/uss820dci_atmelarm.c (props changed)
head/sys/dev/usb/input/uhid.c (props changed)
head/sys/dev/usb/input/ukbd.c (props changed)
head/sys/dev/usb/input/ums.c (props changed)
head/sys/dev/usb/input/usb_rdesc.h (props changed)
head/sys/dev/usb/misc/udbp.c (props changed)
head/sys/dev/usb/misc/udbp.h (props changed)
head/sys/dev/usb/misc/ufm.c (props changed)
head/sys/dev/usb/net/if_aue.c (props changed)
head/sys/dev/usb/net/if_auereg.h (props changed)
head/sys/dev/usb/net/if_axe.c (props changed)
head/sys/dev/usb/net/if_axereg.h (props changed)
head/sys/dev/usb/net/if_cdce.c (props changed)
head/sys/dev/usb/net/if_cdcereg.h (props changed)
head/sys/dev/usb/net/if_cue.c (props changed)
head/sys/dev/usb/net/if_cuereg.h (props changed)
head/sys/dev/usb/net/if_kue.c (props changed)
head/sys/dev/usb/net/if_kuefw.h (props changed)
head/sys/dev/usb/net/if_kuereg.h (props changed)
head/sys/dev/usb/net/if_rue.c (props changed)
head/sys/dev/usb/net/if_ruereg.h (props changed)
head/sys/dev/usb/net/if_udav.c (props changed)
head/sys/dev/usb/net/if_udavreg.h (props changed)
head/sys/dev/usb/net/usb_ethernet.c (props changed)
head/sys/dev/usb/net/usb_ethernet.h (props changed)
head/sys/dev/usb/quirk/usb_quirk.c (props changed)
head/sys/dev/usb/quirk/usb_quirk.h (props changed)
head/sys/dev/usb/serial/u3g.c (props changed)
head/sys/dev/usb/serial/uark.c (props changed)
head/sys/dev/usb/serial/ubsa.c (props changed)
head/sys/dev/usb/serial/ubser.c (props changed)
head/sys/dev/usb/serial/uchcom.c (props changed)
head/sys/dev/usb/serial/ucycom.c (props changed)
head/sys/dev/usb/serial/ufoma.c (props changed)
head/sys/dev/usb/serial/uftdi.c (props changed)
head/sys/dev/usb/serial/uftdi_reg.h (props changed)
head/sys/dev/usb/serial/ugensa.c (props changed)
head/sys/dev/usb/serial/uipaq.c (props changed)
head/sys/dev/usb/serial/ulpt.c (props changed)
head/sys/dev/usb/serial/umct.c (props changed)
head/sys/dev/usb/serial/umodem.c (props changed)
head/sys/dev/usb/serial/umoscom.c (props changed)
head/sys/dev/usb/serial/uplcom.c (props changed)
head/sys/dev/usb/serial/usb_serial.c (props changed)
head/sys/dev/usb/serial/usb_serial.h (props changed)
head/sys/dev/usb/serial/uslcom.c (props changed)
head/sys/dev/usb/serial/uvisor.c (props changed)
head/sys/dev/usb/serial/uvscom.c (props changed)
head/sys/dev/usb/storage/rio500_usb.h (props changed)
head/sys/dev/usb/storage/umass.c (props changed)
head/sys/dev/usb/storage/urio.c (props changed)
head/sys/dev/usb/storage/ustorage_fs.c (props changed)
head/sys/dev/usb/template/usb_template.c (props changed)
head/sys/dev/usb/template/usb_template.h (props changed)
head/sys/dev/usb/template/usb_template_cdce.c (props changed)
head/sys/dev/usb/template/usb_template_msc.c (props changed)
head/sys/dev/usb/template/usb_template_mtp.c (props changed)
head/sys/dev/usb/ufm_ioctl.h (props changed)
head/sys/dev/usb/usb.h (props changed)
head/sys/dev/usb/usb_bus.h (props changed)
head/sys/dev/usb/usb_busdma.c (props changed)
head/sys/dev/usb/usb_busdma.h (props changed)
head/sys/dev/usb/usb_cdc.h (props changed)
head/sys/dev/usb/usb_compat_linux.c (props changed)
head/sys/dev/usb/usb_compat_linux.h (props changed)
head/sys/dev/usb/usb_controller.h (props changed)
head/sys/dev/usb/usb_core.c (props changed)
head/sys/dev/usb/usb_core.h (props changed)
head/sys/dev/usb/usb_debug.c (props changed)
head/sys/dev/usb/usb_debug.h (props changed)
head/sys/dev/usb/usb_defs.h (props changed)
head/sys/dev/usb/usb_dev.c (props changed)
head/sys/dev/usb/usb_dev.h (props changed)
head/sys/dev/usb/usb_device.c (props changed)
head/sys/dev/usb/usb_device.h (props changed)
head/sys/dev/usb/usb_dynamic.c (props changed)
head/sys/dev/usb/usb_dynamic.h (props changed)
head/sys/dev/usb/usb_endian.h (props changed)
head/sys/dev/usb/usb_error.c (props changed)
head/sys/dev/usb/usb_error.h (props changed)
head/sys/dev/usb/usb_generic.c (props changed)
head/sys/dev/usb/usb_generic.h (props changed)
head/sys/dev/usb/usb_handle_request.c (props changed)
head/sys/dev/usb/usb_handle_request.h (props changed)
head/sys/dev/usb/usb_hid.c (props changed)
head/sys/dev/usb/usb_hid.h (props changed)
head/sys/dev/usb/usb_hub.c (props changed)
head/sys/dev/usb/usb_hub.h (props changed)
head/sys/dev/usb/usb_if.m (props changed)
head/sys/dev/usb/usb_ioctl.h (props changed)
head/sys/dev/usb/usb_lookup.c (props changed)
head/sys/dev/usb/usb_lookup.h (props changed)
head/sys/dev/usb/usb_mbuf.c (props changed)
head/sys/dev/usb/usb_mbuf.h (props changed)
head/sys/dev/usb/usb_mfunc.h (props changed)
head/sys/dev/usb/usb_msctest.c (props changed)
head/sys/dev/usb/usb_msctest.h (props changed)
head/sys/dev/usb/usb_parse.c (props changed)
head/sys/dev/usb/usb_parse.h (props changed)
head/sys/dev/usb/usb_pci.h (props changed)
head/sys/dev/usb/usb_process.c (props changed)
head/sys/dev/usb/usb_process.h (props changed)
head/sys/dev/usb/usb_request.c (props changed)
head/sys/dev/usb/usb_request.h (props changed)
head/sys/dev/usb/usb_revision.h (props changed)
head/sys/dev/usb/usb_sw_transfer.c (props changed)
head/sys/dev/usb/usb_sw_transfer.h (props changed)
head/sys/dev/usb/usb_transfer.c (props changed)
head/sys/dev/usb/usb_transfer.h (props changed)
head/sys/dev/usb/usb_util.c (props changed)
head/sys/dev/usb/usb_util.h (props changed)
head/sys/dev/usb/usbdevs (props changed)
head/sys/dev/usb/usbhid.h (props changed)
head/sys/dev/usb/wlan/if_rum.c (props changed)
head/sys/dev/usb/wlan/if_rumfw.h (props changed)
head/sys/dev/usb/wlan/if_rumreg.h (props changed)
head/sys/dev/usb/wlan/if_rumvar.h (props changed)
head/sys/dev/usb/wlan/if_ural.c (props changed)
head/sys/dev/usb/wlan/if_uralreg.h (props changed)
head/sys/dev/usb/wlan/if_uralvar.h (props changed)
head/sys/dev/usb/wlan/if_zyd.c (props changed)
head/sys/dev/usb/wlan/if_zydfw.h (props changed)
head/sys/dev/usb/wlan/if_zydreg.h (props changed)
head/sys/dev/usb/wlan/usb_wlan.h (props changed)
head/sys/dev/xen/netfront/ (props changed)
head/sys/dev/xen/xenpci/ (props changed)
head/sys/legacy/dev/ata/ata-usb.c (props changed)
head/sys/legacy/dev/sound/usb/uaudio.c (props changed)
head/sys/legacy/dev/sound/usb/uaudio.h (props changed)
head/sys/legacy/dev/sound/usb/uaudio_pcm.c (props changed)
head/sys/legacy/dev/sound/usb/uaudioreg.h (props changed)
head/sys/legacy/dev/usb/ (props changed)
head/sys/legacy/dev/usb/ehci_ixp4xx.c (props changed)
head/sys/mips/mips/elf64_machdep.c (props changed)
head/sys/netinet/ip_fw.h
head/sys/netinet/ip_fw2.c
head/sys/netinet/ip_fw_pfil.c
head/sys/xen/evtchn.h (props changed)
head/sys/xen/hypervisor.h (props changed)
head/sys/xen/xen_intr.h (props changed)
Modified: head/sbin/ipfw/ipfw.8
==============================================================================
--- head/sbin/ipfw/ipfw.8 Wed Apr 1 19:23:46 2009 (r190632)
+++ head/sbin/ipfw/ipfw.8 Wed Apr 1 20:23:47 2009 (r190633)
@@ -866,6 +866,13 @@ in any subsequent forwarding decisions.
Initially this is limited to the values 0 through 15, see
.Xr setfib 8 .
Processing continues at the next rule.
+.It Cm reass
+Queue and reassemble ip fragments.
+If the packet is not fragmented, counters are updated and processing continues with the next rule.
+If the packet is the last logical fragment, the packet is reassembled and, if
+.Va net.inet.ip.fw.one_pass
+is set to 0, processing continues with the next rule, else packet is allowed to pass and search terminates.
+If the packet is a fragment in the middle, it is consumed and processing stops immediately.
.El
.Ss RULE BODY
The body of a rule contains zero or more patterns (such as
Modified: head/sbin/ipfw/ipfw2.c
==============================================================================
--- head/sbin/ipfw/ipfw2.c Wed Apr 1 19:23:46 2009 (r190632)
+++ head/sbin/ipfw/ipfw2.c Wed Apr 1 20:23:47 2009 (r190633)
@@ -211,6 +211,7 @@ static struct _s_x rule_actions[] = {
{ "check-state", TOK_CHECKSTATE },
{ "//", TOK_COMMENT },
{ "nat", TOK_NAT },
+ { "reass", TOK_REASS },
{ "setfib", TOK_SETFIB },
{ NULL, 0 } /* terminator */
};
@@ -1089,6 +1090,10 @@ show_ipfw(struct ip_fw *rule, int pcwidt
case O_SETFIB:
PRINT_UINT_ARG("setfib ", cmd->arg1);
break;
+
+ case O_REASS:
+ printf("reass");
+ break;
default:
printf("** unrecognized action %d len %d ",
@@ -2781,6 +2786,10 @@ chkarg:
ac--; av++;
break;
}
+
+ case TOK_REASS:
+ action->opcode = O_REASS;
+ break;
default:
errx(EX_DATAERR, "invalid action %s\n", av[-1]);
Modified: head/sbin/ipfw/ipfw2.h
==============================================================================
--- head/sbin/ipfw/ipfw2.h Wed Apr 1 19:23:46 2009 (r190632)
+++ head/sbin/ipfw/ipfw2.h Wed Apr 1 20:23:47 2009 (r190633)
@@ -95,6 +95,7 @@ enum tokens {
TOK_UNREACH,
TOK_CHECKSTATE,
TOK_NAT,
+ TOK_REASS,
TOK_ALTQ,
TOK_LOG,
Modified: head/sbin/ipfw/main.c
==============================================================================
--- head/sbin/ipfw/main.c Wed Apr 1 19:23:46 2009 (r190632)
+++ head/sbin/ipfw/main.c Wed Apr 1 20:23:47 2009 (r190633)
@@ -54,7 +54,7 @@ help(void)
"RULE-BODY: check-state [PARAMS] | ACTION [PARAMS] ADDR [OPTION_LIST]\n"
"ACTION: check-state | allow | count | deny | unreach{,6} CODE |\n"
" skipto N | {divert|tee} PORT | forward ADDR |\n"
-" pipe N | queue N | nat N | setfib FIB\n"
+" pipe N | queue N | nat N | setfib FIB | reass\n"
"PARAMS: [log [logamount LOGLIMIT]] [altq QUEUE_NAME]\n"
"ADDR: [ MAC dst src ether_type ] \n"
" [ ip from IPADDR [ PORT ] to IPADDR [ PORTLIST ] ]\n"
Modified: head/sys/netinet/ip_fw.h
==============================================================================
--- head/sys/netinet/ip_fw.h Wed Apr 1 19:23:46 2009 (r190632)
+++ head/sys/netinet/ip_fw.h Wed Apr 1 20:23:47 2009 (r190633)
@@ -139,7 +139,8 @@ enum ipfw_opcodes { /* arguments (4 byt
O_FORWARD_IP, /* fwd sockaddr */
O_FORWARD_MAC, /* fwd mac */
O_NAT, /* nope */
-
+ O_REASS, /* none */
+
/*
* More opcodes.
*/
@@ -574,6 +575,7 @@ enum {
IP_FW_NETGRAPH,
IP_FW_NGTEE,
IP_FW_NAT,
+ IP_FW_REASS,
};
/* flags for divert mtag */
Modified: head/sys/netinet/ip_fw2.c
==============================================================================
--- head/sys/netinet/ip_fw2.c Wed Apr 1 19:23:46 2009 (r190632)
+++ head/sys/netinet/ip_fw2.c Wed Apr 1 20:23:47 2009 (r190633)
@@ -898,6 +898,9 @@ ipfw_log(struct ip_fw *f, u_int hlen, st
case O_NAT:
action = "Nat";
break;
+ case O_REASS:
+ action = "Reass";
+ break;
default:
action = "UNKNOWN";
break;
@@ -3375,6 +3378,55 @@ check_body:
goto done;
}
+ case O_REASS: {
+ int ip_off;
+
+ f->pcnt++;
+ f->bcnt += pktlen;
+ ip_off = (args->eh != NULL) ? ntohs(ip->ip_off) : ip->ip_off;
+ if (ip_off & (IP_MF | IP_OFFMASK)) {
+ /*
+ * ip_reass() expects len & off in host
+ * byte order: fix them in case we come
+ * from layer2.
+ */
+ if (args->eh != NULL) {
+ ip->ip_len = ntohs(ip->ip_len);
+ ip->ip_off = ntohs(ip->ip_off);
+ }
+
+ m = ip_reass(m);
+ args->m = m;
+
+ /*
+ * IP header checksum fixup after
+ * reassembly and leave header
+ * in network byte order.
+ */
+ if (m != NULL) {
+ int hlen;
+
+ ip = mtod(m, struct ip *);
+ hlen = ip->ip_hl << 2;
+ /* revert len & off for layer2 pkts */
+ if (args->eh != NULL)
+ ip->ip_len = htons(ip->ip_len);
+ ip->ip_sum = 0;
+ if (hlen == sizeof(struct ip))
+ ip->ip_sum = in_cksum_hdr(ip);
+ else
+ ip->ip_sum = in_cksum(m, hlen);
+ retval = IP_FW_REASS;
+ args->rule = f;
+ goto done;
+ } else {
+ retval = IP_FW_DENY;
+ goto done;
+ }
+ }
+ goto next_rule;
+ }
+
default:
panic("-- unknown opcode %d\n", cmd->opcode);
} /* end of switch() on opcodes */
@@ -4024,6 +4076,7 @@ check_ipfw_struct(struct ip_fw *rule, in
case O_UNREACH6:
#endif
case O_SKIPTO:
+ case O_REASS:
check_size:
if (cmdlen != F_INSN_SIZE(ipfw_insn))
goto bad_size;
Modified: head/sys/netinet/ip_fw_pfil.c
==============================================================================
--- head/sys/netinet/ip_fw_pfil.c Wed Apr 1 19:23:46 2009 (r190632)
+++ head/sys/netinet/ip_fw_pfil.c Wed Apr 1 20:23:47 2009 (r190633)
@@ -200,6 +200,9 @@ again:
case IP_FW_NAT:
goto again; /* continue with packet */
+ case IP_FW_REASS:
+ goto again;
+
default:
KASSERT(0, ("%s: unknown retval", __func__));
}
@@ -329,6 +332,9 @@ again:
case IP_FW_NAT:
goto again; /* continue with packet */
+ case IP_FW_REASS:
+ goto again;
+
default:
KASSERT(0, ("%s: unknown retval", __func__));
}
More information about the svn-src-head
mailing list