X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fdpif-provider.h;h=fbd370fcc05b67dca8388eb19a940d5eb8d11068;hb=HEAD;hp=9f6ef044b238fa7162cc46b5454dab049eaa4908;hpb=1a0c894a2685f0cc0d19fc3caf69dd0d62b6b6b0;p=cascardo%2Fovs.git diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h index 9f6ef044b..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'. */ @@ -239,37 +252,6 @@ struct dpif_class { * value other than EAGAIN. */ void (*port_poll_wait)(const struct dpif *dpif); - /* Queries 'dpif' for a flow entry. The flow is specified by the Netlink - * attributes with types OVS_KEY_ATTR_* in the 'key_len' bytes starting at - * 'key'. - * - * Returns 0 if successful. If no flow matches, returns ENOENT. On other - * failure, returns a positive errno value. - * - * On success, '*bufp' will be set to an ofpbuf owned by the caller that - * contains the response for 'maskp' and/or 'actionsp'. The caller must - * supply a valid pointer, and must free the ofpbuf (with ofpbuf_delete()) - * when it is no longer needed. - * - * If 'maskp' is nonnull, then on success '*maskp' will point to the - * Netlink attributes for the flow's mask. '*mask_len' will be set to the - * length of the mask attributes. Implementations may opt to point 'maskp' - * at RCU-protected data rather than making a copy in '*bufp'. - * - * If 'actionsp' is nonnull, then on success '*actionsp' will point to the - * Netlink attributes for the flow's actions. '*actions_len' will be set to - * the length of the actions attributes. Implementations may opt to point - * 'actionsp' at RCU-protected data rather than making a copy in '*bufp'. - * - * If 'stats' is nonnull, then on success it must be updated with the - * flow's statistics. */ - int (*flow_get)(const struct dpif *dpif, - const struct nlattr *key, size_t key_len, - struct ofpbuf **bufp, - struct nlattr **maskp, size_t *mask_len, - struct nlattr **actionsp, size_t *acts_len, - struct dpif_flow_stats *stats); - /* Deletes all flows from 'dpif' and clears all of its queues of received * packets. */ int (*flow_flush)(struct dpif *dpif); @@ -287,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)( @@ -331,6 +317,11 @@ 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. '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. */ int (*queue_to_priority)(const struct dpif *dpif, uint32_t queue_id, @@ -371,24 +362,64 @@ 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 - * if 'dpif' directly executes upcall functions. */ - void (*register_upcall_cb)(struct dpif *, exec_upcall_cb *); + * 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); /* Enables upcalls if 'dpif' directly executes upcall functions. */ void (*enable_upcall)(struct dpif *); /* 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_linux_class; +extern const struct dpif_class dpif_netlink_class; extern const struct dpif_class dpif_netdev_class; #ifdef __cplusplus