openflow: Table maintenance commands for Geneve options.
[cascardo/ovs.git] / include / openflow / nicira-ext.h
index e749450..22325aa 100644 (file)
@@ -900,4 +900,74 @@ struct nx_flow_monitor_cancel {
 };
 OFP_ASSERT(sizeof(struct nx_flow_monitor_cancel) == 4);
 
+/* Geneve option table maintainance commands.
+ *
+ * In order to work with Geneve options, we need to maintain a mapping
+ * table between an option (defined by <class, type, length>) and
+ * an NXM field that can be operated on for the purposes of matches,
+ * actions, etc. This mapping must be explicitly specified by the
+ * user.
+ *
+ * There are two primary groups of OpenFlow messages that are introduced
+ * as Nicira extensions: modification commands (add, delete, clear mappings)
+ * and table status request/reply to dump the current table along with switch
+ * information.
+ *
+ * Note that mappings should not be changed while they are in active use by
+ * a flow. The result of doing so is undefined. */
+
+/* Geneve table commands */
+enum nx_geneve_table_mod_command {
+    NXGTMC_ADD,          /* New mappings (fails if an option is already
+                            mapped). */
+    NXGTMC_DELETE,       /* Delete mappings, identified by index
+                          * (unmapped options are ignored). */
+    NXGTMC_CLEAR,        /* Clear all mappings. Additional information
+                            in this command is ignored. */
+};
+
+/* Map between a Geneve option and an NXM field. */
+struct nx_geneve_map {
+    ovs_be16 option_class; /* Geneve option class. */
+    uint8_t  option_type;  /* Geneve option type. */
+    uint8_t  option_len;   /* Geneve option length (multiple of 4). */
+    ovs_be16 index;        /* NXM_NX_TUN_METADATA<n> index */
+    uint8_t  pad[2];
+};
+OFP_ASSERT(sizeof(struct nx_geneve_map) == 8);
+
+/* NXT_GENEVE_TABLE_MOD.
+ *
+ * Use to configure a mapping between Geneve options (class, type, length)
+ * and NXM fields (NXM_NX_TUN_METADATA<n> where 'index' is <n>).
+ *
+ * This command is atomic: all operations on different options will
+ * either succeed or fail. */
+struct nx_geneve_table_mod {
+    ovs_be16 command;           /* One of NTGTMC_* */
+    uint8_t pad[6];
+    /* struct nx_geneve_map[0]; Array of maps between indicies and Geneve
+                                options. The number of elements is
+                                inferred from the length field in the
+                                header. */
+};
+OFP_ASSERT(sizeof(struct nx_geneve_table_mod) == 8);
+
+/* NXT_GENEVE_TABLE_REPLY.
+ *
+ * Issued in reponse to an NXT_GENEVE_TABLE_REQUEST to give information
+ * about the current status of the Geneve table in the switch. Provides
+ * both static information about the switch's capabilities as well as
+ * the configured Geneve option table. */
+struct nx_geneve_table_reply {
+    ovs_be32 max_option_space; /* Maximum total of option sizes supported. */
+    ovs_be16 max_fields;       /* Maximum number of match fields supported. */
+    uint8_t pad[2];
+    /* struct nx_geneve_map[0]; Array of maps between indicies and Geneve
+                                options. The number of elements is
+                                inferred from the length field in the
+                                header. */
+};
+OFP_ASSERT(sizeof(struct nx_geneve_table_reply) == 8);
+
 #endif /* openflow/nicira-ext.h */