void udpif_recv_set(struct udpif *, size_t n_workers, bool enable);
void udpif_destroy(struct udpif *);
-void udpif_run(struct udpif *);
void udpif_wait(struct udpif *);
void udpif_revalidate(struct udpif *);
/* An upcall. */
struct upcall {
struct list list_node; /* For queuing upcalls. */
+ struct flow_miss *flow_miss; /* This upcall's flow_miss. */
enum upcall_type type; /* Classification. */
/* Raw upcall plus data for keeping track of the memory backing it. */
struct dpif_upcall dpif_upcall; /* As returned by dpif_recv() */
struct ofpbuf upcall_buf; /* Owns some data in 'dpif_upcall'. */
- uint64_t upcall_stub[256 / 8]; /* Buffer to reduce need for malloc(). */
+ uint64_t upcall_stub[512 / 8]; /* Buffer to reduce need for malloc(). */
};
struct upcall *upcall_next(struct udpif *);
enum odp_key_fitness key_fitness;
const struct nlattr *key;
size_t key_len;
- struct list packets;
enum dpif_upcall_type upcall_type;
struct dpif_flow_stats stats;
struct xlate_out xout;
-
- struct list upcalls;
};
struct flow_miss_batch {
struct flow_miss miss_buf[FLOW_MISS_MAX_BATCH];
struct hmap misses;
+
+ unsigned int reval_seq;
+
+ /* Flow misses refer to the memory held by "struct upcall"s,
+ * so we need to keep track of the upcalls to be able to
+ * free them when done. */
+ struct list upcalls; /* Contains "struct upcall"s. */
};
struct flow_miss_batch *flow_miss_batch_next(struct udpif *);