X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=lib%2Fdpif.h;h=50174ee95d329fdcf4ba2acacade9958026535c0;hb=9891d1332d9ed388701a2f662354a5aa283220ea;hp=45792b9a5b6272deecc811d68590fb4b27d1c0f2;hpb=b5cbbcf6561732d2f99ed0619defcc7aff1e75db;p=cascardo%2Fovs.git diff --git a/lib/dpif.h b/lib/dpif.h index 45792b9a5..50174ee95 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -389,8 +389,9 @@ #include #include #include "netdev.h" -#include "ofpbuf.h" +#include "dp-packet.h" #include "openflow/openflow.h" +#include "ovs-numa.h" #include "packets.h" #include "util.h" @@ -421,7 +422,7 @@ int dpif_create(const char *name, const char *type, struct dpif **); int dpif_create_and_open(const char *name, const char *type, struct dpif **); void dpif_close(struct dpif *); -void dpif_run(struct dpif *); +bool dpif_run(struct dpif *); void dpif_wait(struct dpif *); const char *dpif_name(const struct dpif *); @@ -504,7 +505,7 @@ struct dpif_flow_stats { uint16_t tcp_flags; }; -void dpif_flow_stats_extract(const struct flow *, const struct ofpbuf *packet, +void dpif_flow_stats_extract(const struct flow *, const struct dp_packet *packet, long long int used, struct dpif_flow_stats *); void dpif_flow_stats_format(const struct dpif_flow_stats *, struct ds *); @@ -515,17 +516,24 @@ enum dpif_flow_put_flags { DPIF_FP_PROBE = 1 << 3 /* Suppress error messages, if any. */ }; +bool dpif_probe_feature(struct dpif *, const char *name, + const struct ofpbuf *key, const ovs_u128 *ufid); +void dpif_flow_hash(const struct dpif *, const void *key, size_t key_len, + ovs_u128 *hash); int dpif_flow_flush(struct dpif *); int dpif_flow_put(struct dpif *, enum dpif_flow_put_flags, const struct nlattr *key, size_t key_len, const struct nlattr *mask, size_t mask_len, const struct nlattr *actions, size_t actions_len, + const ovs_u128 *ufid, const unsigned pmd_id, struct dpif_flow_stats *); int dpif_flow_del(struct dpif *, const struct nlattr *key, size_t key_len, + const ovs_u128 *ufid, const unsigned pmd_id, struct dpif_flow_stats *); int dpif_flow_get(struct dpif *, const struct nlattr *key, size_t key_len, + const ovs_u128 *ufid, const unsigned pmd_id, struct ofpbuf *, struct dpif_flow *); /* Flow dumping interface @@ -556,13 +564,15 @@ int dpif_flow_get(struct dpif *, * * All error reporting is deferred to the call to dpif_flow_dump_destroy(). */ -struct dpif_flow_dump *dpif_flow_dump_create(const struct dpif *); +struct dpif_flow_dump *dpif_flow_dump_create(const struct dpif *, bool terse); int dpif_flow_dump_destroy(struct dpif_flow_dump *); struct dpif_flow_dump_thread *dpif_flow_dump_thread_create( struct dpif_flow_dump *); void dpif_flow_dump_thread_destroy(struct dpif_flow_dump_thread *); +#define PMD_ID_NULL OVS_CORE_UNSPEC + /* A datapath flow as dumped by dpif_flow_dump_next(). */ struct dpif_flow { const struct nlattr *key; /* Flow key, as OVS_KEY_ATTR_* attrs. */ @@ -571,6 +581,9 @@ struct dpif_flow { size_t mask_len; /* 'mask' length in bytes. */ const struct nlattr *actions; /* Actions, as OVS_ACTION_ATTR_ */ size_t actions_len; /* 'actions' length in bytes. */ + ovs_u128 ufid; /* Unique flow identifier. */ + bool ufid_present; /* True if 'ufid' was provided by datapath.*/ + unsigned pmd_id; /* Datapath poll mode driver id. */ struct dpif_flow_stats stats; /* Flow statistics. */ }; int dpif_flow_dump_next(struct dpif_flow_dump_thread *, @@ -612,6 +625,10 @@ enum dpif_op_type { * * If the operation succeeds, then 'stats', if nonnull, will be set to the * flow's statistics before the update. + * + * - If the datapath implements multiple pmd thread with its own flow + * table, 'pmd_id' should be used to specify the particular polling + * thread for the operation. */ struct dpif_flow_put { /* Input. */ @@ -622,6 +639,8 @@ struct dpif_flow_put { size_t mask_len; /* Length of 'mask' in bytes. */ const struct nlattr *actions; /* Actions to perform on flow. */ size_t actions_len; /* Length of 'actions' in bytes. */ + const ovs_u128 *ufid; /* Optional unique flow identifier. */ + unsigned pmd_id; /* Datapath poll mode driver id. */ /* Output. */ struct dpif_flow_stats *stats; /* Optional flow statistics. */ @@ -630,8 +649,18 @@ struct dpif_flow_put { /* Delete a flow. * * The flow is specified by the Netlink attributes with types OVS_KEY_ATTR_* in - * the 'key_len' bytes starting at 'key'. Succeeds with status 0 if the flow - * is deleted, or fails with ENOENT if the dpif does not contain such a flow. + * the 'key_len' bytes starting at 'key', or the unique identifier 'ufid'. If + * the flow was created using 'ufid', then 'ufid' must be specified to delete + * the flow. If both are specified, 'key' will be ignored for flow deletion. + * Succeeds with status 0 if the flow is deleted, or fails with ENOENT if the + * dpif does not contain such a flow. + * + * Callers should always provide the 'key' to improve dpif logging in the event + * of errors or unexpected behaviour. + * + * If the datapath implements multiple polling thread with its own flow table, + * 'pmd_id' should be used to specify the particular polling thread for the + * operation. * * If the operation succeeds, then 'stats', if nonnull, will be set to the * flow's statistics before its deletion. */ @@ -639,6 +668,10 @@ struct dpif_flow_del { /* Input. */ const struct nlattr *key; /* Flow to delete. */ size_t key_len; /* Length of 'key' in bytes. */ + const ovs_u128 *ufid; /* Unique identifier of flow to delete. */ + bool terse; /* OK to skip sending/receiving full flow + * info? */ + unsigned pmd_id; /* Datapath poll mode driver id. */ /* Output. */ struct dpif_flow_stats *stats; /* Optional flow statistics. */ @@ -664,17 +697,21 @@ struct dpif_execute { size_t actions_len; /* Length of 'actions' in bytes. */ bool needs_help; bool probe; /* Suppress error messages. */ + unsigned int mtu; /* Maximum transmission unit to fragment. + 0 if not a fragmented packet */ /* Input, but possibly modified as a side effect of execution. */ - struct ofpbuf *packet; /* Packet to execute. */ - struct pkt_metadata md; /* Packet metadata. */ + struct dp_packet *packet; /* Packet to execute. */ }; /* Queries the 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'. 'buffer' must point to an initialized - * buffer, with a recommended size of DPIF_FLOW_BUFSIZE bytes. + * the 'key_len' bytes starting at 'key', or the unique identifier 'ufid'. If + * the flow was created using 'ufid', then 'ufid' must be specified to fetch + * the flow. If both are specified, 'key' will be ignored for the flow query. + * 'buffer' must point to an initialized buffer, with a recommended size of + * DPIF_FLOW_BUFSIZE bytes. * * On success, 'flow' will be populated with the mask, actions and stats for * the datapath flow corresponding to 'key'. The mask and actions may point @@ -682,6 +719,13 @@ struct dpif_execute { * that wish to hold these over quiescent periods must make a copy of these * fields before quiescing. * + * Callers should always provide 'key' to improve dpif logging in the event of + * errors or unexpected behaviour. + * + * If the datapath implements multiple polling thread with its own flow table, + * 'pmd_id' should be used to specify the particular polling thread for the + * operation. + * * Succeeds with status 0 if the flow is fetched, or fails with ENOENT if no * such flow exists. Other failures are indicated with a positive errno value. */ @@ -689,6 +733,8 @@ struct dpif_flow_get { /* Input. */ const struct nlattr *key; /* Flow to get. */ size_t key_len; /* Length of 'key' in bytes. */ + const ovs_u128 *ufid; /* Unique identifier of flow to get. */ + unsigned pmd_id; /* Datapath poll mode driver id. */ struct ofpbuf *buffer; /* Storage for output parameters. */ /* Output. */ @@ -732,20 +778,37 @@ const char *dpif_upcall_type_to_string(enum dpif_upcall_type); struct dpif_upcall { /* All types. */ enum dpif_upcall_type type; - struct ofpbuf packet; /* Packet data. */ + struct dp_packet packet; /* Packet data. */ struct nlattr *key; /* Flow key. */ size_t key_len; /* Length of 'key' in bytes. */ + ovs_u128 ufid; /* Unique flow identifier for 'key'. */ + struct nlattr *mru; /* Maximum receive unit. */ /* DPIF_UC_ACTION only. */ struct nlattr *userdata; /* Argument to OVS_ACTION_ATTR_USERSPACE. */ struct nlattr *out_tun_key; /* Output tunnel key. */ + struct nlattr *actions; /* Argument to OVS_ACTION_ATTR_USERSPACE. */ }; +/* A callback to notify higher layer of dpif about to be purged, so that + * higher layer could try reacting to this (e.g. grabbing all flow stats + * before they are gone). This function is currently implemented only by + * dpif-netdev. + * + * The caller needs to provide the 'aux' pointer passed down by higher + * layer from the dpif_register_notify_cb() function and the 'pmd_id' of + * the polling thread. + */ + typedef void dp_purge_callback(void *aux, unsigned pmd_id); + +void dpif_register_dp_purge_cb(struct dpif *, dp_purge_callback *, void *aux); + /* A callback to process an upcall, currently implemented only by dpif-netdev. * - * The caller provides the 'packet' and 'flow' to process, the 'type' of the - * upcall, and if 'type' is DPIF_UC_ACTION then the 'userdata' attached to the - * action. + * The caller provides the 'packet' and 'flow' to process, the corresponding + * 'ufid' as generated by dpif_flow_hash(), the polling thread id 'pmd_id', + * the 'type' of the upcall, and if 'type' is DPIF_UC_ACTION then the + * 'userdata' attached to the action. * * The callback must fill in 'actions' with the datapath actions to apply to * 'packet'. 'wc' and 'put_actions' will either be both null or both nonnull. @@ -758,8 +821,10 @@ struct dpif_upcall { * * Returns 0 if successful, ENOSPC if the flow limit has been reached and no * flow should be installed, or some otherwise a positive errno value. */ -typedef int upcall_callback(const struct ofpbuf *packet, +typedef int upcall_callback(const struct dp_packet *packet, const struct flow *flow, + ovs_u128 *ufid, + unsigned pmd_id, enum dpif_upcall_type type, const struct nlattr *userdata, struct ofpbuf *actions, @@ -791,6 +856,7 @@ int dpif_queue_to_priority(const struct dpif *, uint32_t queue_id, uint32_t *priority); char *dpif_get_dp_version(const struct dpif *); +bool dpif_supports_tnl_push_pop(const struct dpif *); #ifdef __cplusplus } #endif