X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdpif-linux.c;h=e5ea31a5e8099a910750a70d891bc01077ed9d6c;hb=1ba530f4b2cd5476a224dbbf87a3089a831a24b6;hp=8e584ea5de051a012a823994495ba7ff1a67c3a8;hpb=ea7bd5973fb426f3a6ea66b0953c6000980e77ec;p=sliver-openvswitch.git diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c index 8e584ea5d..e5ea31a5e 100644 --- a/lib/dpif-linux.c +++ b/lib/dpif-linux.c @@ -645,6 +645,26 @@ dpif_linux_recv_wait(struct dpif *dpif_) poll_fd_wait(dpif->fd, POLLIN); } +static void +dpif_linux_recv_purge(struct dpif *dpif_) +{ + struct dpif_linux *dpif = dpif_linux_cast(dpif_); + int i; + + /* This is somewhat bogus because it assumes that the following macros have + * fixed values, but it's going to go away later. */ +#define DP_N_QUEUES 3 +#define DP_MAX_QUEUE_LEN 100 + for (i = 0; i < DP_N_QUEUES * DP_MAX_QUEUE_LEN; i++) { + /* Reading even 1 byte discards a whole datagram and saves time. */ + char buffer; + + if (read(dpif->fd, &buffer, 1) != 1) { + break; + } + } +} + const struct dpif_class dpif_linux_class = { "system", NULL, @@ -681,6 +701,7 @@ const struct dpif_class dpif_linux_class = { dpif_linux_queue_to_priority, dpif_linux_recv, dpif_linux_recv_wait, + dpif_linux_recv_purge, }; static int get_openvswitch_major(void);