X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fdpif-provider.h;h=fbd370fcc05b67dca8388eb19a940d5eb8d11068;hb=8b8ef592521e32d0e32581bf39c5d2a5cd445977;hp=65cf505f91a171f8761d2b7f45fff5c6279c650c;hpb=f2eee189118139995d61468cecb85654dd45bb36;p=cascardo%2Fovs.git diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h index 65cf505f9..fbd370fcc 100644 --- a/lib/dpif-provider.h +++ b/lib/dpif-provider.h @@ -53,6 +53,7 @@ static inline void dpif_assert_class(const struct dpif *dpif, struct dpif_flow_dump { struct dpif *dpif; + bool terse; /* If true, key/mask/actions may be omitted. */ }; static inline void @@ -72,6 +73,9 @@ dpif_flow_dump_thread_init(struct dpif_flow_dump_thread *thread, thread->dpif = dump->dpif; } +struct ct_dpif_dump_state; +struct ct_dpif_entry; + /* Datapath interface class structure, to be defined by each implementation of * a datapath interface. * @@ -89,6 +93,14 @@ struct dpif_class { * the type assumed if no type is specified when opening a dpif. */ const char *type; + /* Called when the dpif provider is registered, typically at program + * startup. Returning an error from this function will prevent any + * datapath with this class from being created. + * + * This function may be set to null if a datapath class needs no + * initialization at registration time. */ + int (*init)(void); + /* Enumerates the names of all known created datapaths (of class * 'dpif_class'), if possible, into 'all_dps'. The caller has already * initialized 'all_dps' and other dpif classes might already have added @@ -132,8 +144,9 @@ struct dpif_class { * the 'close' member function. */ int (*destroy)(struct dpif *dpif); - /* Performs periodic work needed by 'dpif', if any is necessary. */ - void (*run)(struct dpif *dpif); + /* Performs periodic work needed by 'dpif', if any is necessary. + * Returns true if need to revalidate. */ + bool (*run)(struct dpif *dpif); /* Arranges for poll_block() to wake up if the "run" member function needs * to be called for 'dpif'. */ @@ -256,8 +269,12 @@ struct dpif_class { * * 'flow_dump_create' and 'flow_dump_thread_create' must initialize the * structures that they return with dpif_flow_dump_init() and - * dpif_flow_dump_thread_init(), respectively. */ - struct dpif_flow_dump *(*flow_dump_create)(const struct dpif *dpif); + * dpif_flow_dump_thread_init(), respectively. + * + * If 'terse' is true, then only UID and statistics will + * be returned in the dump. Otherwise, all fields will be returned. */ + struct dpif_flow_dump *(*flow_dump_create)(const struct dpif *dpif, + bool terse); int (*flow_dump_destroy)(struct dpif_flow_dump *dump); struct dpif_flow_dump_thread *(*flow_dump_thread_create)( @@ -301,11 +318,9 @@ struct dpif_class { int (*handlers_set)(struct dpif *dpif, uint32_t n_handlers); /* If 'dpif' creates its own I/O polling threads, refreshes poll threads - * configuration. 'n_rxqs' configures the number of rx_queues, which - * are distributed among threads. 'cmask' configures the cpu mask - * for setting the polling threads' cpu affinity. */ - int (*poll_threads_set)(struct dpif *dpif, unsigned int n_rxqs, - const char *cmask); + * configuration. 'cmask' configures the cpu mask for setting the polling + * threads' cpu affinity. */ + int (*poll_threads_set)(struct dpif *dpif, const char *cmask); /* Translates OpenFlow queue ID 'queue_id' (in host byte order) into a * priority value used for setting packet priority. */ @@ -347,13 +362,22 @@ struct dpif_class { * return. */ void (*recv_purge)(struct dpif *dpif); + /* When 'dpif' is about to purge the datapath, the higher layer may want + * to be notified so that it could try reacting accordingly (e.g. grabbing + * all flow stats before they are gone). + * + * Registers an upcall callback function with 'dpif'. This is only used + * if 'dpif' needs to notify the purging of datapath. 'aux' is passed to + * the callback on invocation. */ + void (*register_dp_purge_cb)(struct dpif *, dp_purge_callback *, void *aux); + /* For datapaths that run in userspace (i.e. dpif-netdev), threads polling * for incoming packets can directly call upcall functions instead of * offloading packet processing to separate handler threads. Datapaths * that directly call upcall functions should use the functions below to * to register an upcall function and enable / disable upcalls. * - * Registers an upcall callback function with 'dpif'. This is only used if + * Registers an upcall callback function with 'dpif'. This is only used * if 'dpif' directly executes upcall functions. 'aux' is passed to the * callback on invocation. */ void (*register_upcall_cb)(struct dpif *, upcall_callback *, void *aux); @@ -363,6 +387,36 @@ struct dpif_class { /* Disables upcalls if 'dpif' directly executes upcall functions. */ void (*disable_upcall)(struct dpif *); + + /* Get datapath version. Caller is responsible for freeing the string + * returned. */ + char *(*get_datapath_version)(void); + + /* Conntrack entry dumping interface. + * + * These functions are used by ct-dpif.c to provide a datapath-agnostic + * dumping interface to the connection trackes provided by the + * datapaths. + * + * ct_dump_start() should put in '*state' a pointer to a newly allocated + * stucture that will be passed by the caller to ct_dump_next() and + * ct_dump_done(). If 'zone' is not NULL, only the entries in '*zone' + * should be dumped. + * + * ct_dump_next() should fill 'entry' with information from a connection + * and prepare to dump the next one on a subsequest invocation. + * + * ct_dump_done should perform any cleanup necessary (including + * deallocating the 'state' structure, if applicable). */ + int (*ct_dump_start)(struct dpif *, struct ct_dpif_dump_state **state, + const uint16_t *zone); + int (*ct_dump_next)(struct dpif *, struct ct_dpif_dump_state *, + struct ct_dpif_entry *entry); + int (*ct_dump_done)(struct dpif *, struct ct_dpif_dump_state *state); + + /* Flushes the connection tracking tables. If 'zone' is not NULL, + * only deletes connections in '*zone'. */ + int (*ct_flush)(struct dpif *, const uint16_t *zone); }; extern const struct dpif_class dpif_netlink_class;