dpif: Accept 64 kB packets from the kernel.
authorBen Pfaff <blp@nicira.com>
Thu, 19 Mar 2009 17:41:37 +0000 (10:41 -0700)
committerBen Pfaff <blp@nicira.com>
Thu, 19 Mar 2009 18:18:53 +0000 (11:18 -0700)
Under virtualization (e.g. Xen) we sometimes receive packets as large as
64 kB, so the dpif code has to be prepared to accept it.

The only place where we keep these packets around for any amount of time
is when we need to schedule them for sending later, so trim them down
from 64 kB to their actual size in that case.

lib/dpif.c
secchan/pinsched.c

index ce36fb9784b9fc687dae2757a02cb4b395301e7e..7e19c1af62a98012155d72cc5ac1dc67e390861a 100644 (file)
@@ -599,7 +599,7 @@ dpif_recv(struct dpif *dpif, struct ofpbuf **bufp)
     int retval;
     int error;
 
-    buf = ofpbuf_new(2048);     /* XXX scale based on netdev MTUs */
+    buf = ofpbuf_new(65536);
     retval = read(dpif->fd, ofpbuf_tail(buf), ofpbuf_tailroom(buf));
     if (retval < 0) {
         error = errno;
index ca4d5ed95930235705d09114cdb5dd88f4a3473d..6ab09dae60f0dbffbfb9628ad6ea0ac8907bc24f 100644 (file)
@@ -176,6 +176,12 @@ pinsched_send(struct pinsched *ps, uint16_t port_no,
         /* Otherwise queue it up for the periodic callback to drain out. */
         struct ofp_queue *q;
 
+        /* We are called with a buffer obtained from dpif_recv() that has much
+         * more allocated space than actual content most of the time.  Since
+         * we're going to store the packet for some time, free up that
+         * otherwise wasted space. */
+        ofpbuf_trim(packet);
+
         if (ps->n_queued >= ps->burst_limit) {
             drop_packet(ps);
         }