The patch add a tailroom parameter (FromDevice element). Using this, expensive 
puts can be avoided. The allignment for headroom is done after parsing the 
parameters, so that the user specified headroom is also aligned.

Best,
Robert
diff --git a/elements/userlevel/fromdevice.cc b/elements/userlevel/fromdevice.cc
index c46b702..77a0daa 100644
--- a/elements/userlevel/fromdevice.cc
+++ b/elements/userlevel/fromdevice.cc
@@ -75,7 +75,7 @@ FromDevice::configure(Vector<String> &conf, ErrorHandler *errh)
     bool promisc = false, outbound = false, sniffer = true;
     _snaplen = 2046;
     _headroom = Packet::default_headroom;
-    _headroom += (4 - (_headroom + 2) % 4) % 4; // default 4/2 alignment
+    _tailroom = 0;
     _force_ip = false;
     String bpf_filter, capture;
     if (cp_va_kparse(conf, this, errh,
@@ -88,12 +88,16 @@ FromDevice::configure(Vector<String> &conf, ErrorHandler *errh)
 		     "BPF_FILTER", 0, cpString, &bpf_filter,
 		     "OUTBOUND", 0, cpBool, &outbound,
 		     "HEADROOM", 0, cpUnsigned, &_headroom,
+         "TAILROOM", 0, cpUnsigned, &_tailroom,
 		     cpEnd) < 0)
 	return -1;
     if (_snaplen > 8190 || _snaplen < 14)
 	return errh->error("SNAPLEN out of range");
+    _headroom += (4 - (_headroom + 2) % 4) % 4; // default 4/2 alignment
     if (_headroom > 8190)
 	return errh->error("HEADROOM out of range");
+    if (_tailroom > 8190)
+      return errh->error("TAILROOM out of range");
 
 #if FROMDEVICE_PCAP
     _bpf_filter = bpf_filter;
@@ -337,7 +341,7 @@ FromDevice_get_packet(u_char* clientdata,
 
     FromDevice *fd = (FromDevice *) clientdata;
     int length = pkthdr->caplen;
-    Packet *p = Packet::make(fd->_headroom, data, length, 0);
+    Packet *p = Packet::make(fd->_headroom, data, length, fd->_tailroom);
 
     // set packet type annotation
     if (p->data()[0] & 1) {
@@ -378,7 +382,7 @@ FromDevice::selected(int)
     if (_capture == CAPTURE_LINUX) {
 	struct sockaddr_ll sa;
 	socklen_t fromlen = sizeof(sa);
-	WritablePacket *p = Packet::make(_headroom, 0, _snaplen, 0);
+	WritablePacket *p = Packet::make(_headroom, 0, _snaplen, _tailroom);
 	int len = recvfrom(_linux_fd, p->data(), p->length(), MSG_TRUNC, (sockaddr *)&sa, &fromlen);
 	if (len > 0 && (sa.sll_pkttype != PACKET_OUTGOING || _outbound)) {
 	    if (len > _snaplen) {
diff --git a/elements/userlevel/fromdevice.hh b/elements/userlevel/fromdevice.hh
index 3e97edb..082ebb8 100644
--- a/elements/userlevel/fromdevice.hh
+++ b/elements/userlevel/fromdevice.hh
@@ -195,6 +195,7 @@ class FromDevice : public Element { public:
     int _was_promisc : 2;
     int _snaplen;
     unsigned _headroom;
+    unsigned _tailroom;
     enum { CAPTURE_PCAP, CAPTURE_LINUX };
     int _capture;
 #if FROMDEVICE_PCAP
_______________________________________________
click mailing list
[email protected]
https://amsterdam.lcs.mit.edu/mailman/listinfo/click

Reply via email to