+static void
+print_geneve_table(struct ds *s, struct ovs_list *mappings)
+{
+ struct ofputil_geneve_map *map;
+
+ ds_put_cstr(s, " mapping table:\n");
+ ds_put_cstr(s, " class\ttype\tlength\tmatch field\n");
+ ds_put_cstr(s, " -----\t----\t------\t-----------");
+
+ LIST_FOR_EACH (map, list_node, mappings) {
+ ds_put_char(s, '\n');
+ ds_put_format(s, " 0x%"PRIx16"\t0x%"PRIx8"\t%"PRIu8"\ttun_metadata%"PRIu16,
+ map->option_class, map->option_type, map->option_len,
+ map->index);
+ }
+}
+
+static void
+ofp_print_geneve_table_mod(struct ds *s, const struct ofp_header *oh)
+{
+ int error;
+ struct ofputil_geneve_table_mod gtm;
+
+ error = ofputil_decode_geneve_table_mod(oh, >m);
+ if (error) {
+ ofp_print_error(s, error);
+ return;
+ }
+
+ ds_put_cstr(s, "\n ");
+
+ switch (gtm.command) {
+ case NXGTMC_ADD:
+ ds_put_cstr(s, "ADD");
+ break;
+ case NXGTMC_DELETE:
+ ds_put_cstr(s, "DEL");
+ break;
+ case NXGTMC_CLEAR:
+ ds_put_cstr(s, "CLEAR");
+ break;
+ }
+
+ if (gtm.command != NXGTMC_CLEAR) {
+ print_geneve_table(s, >m.mappings);
+ }
+
+ ofputil_uninit_geneve_table(>m.mappings);
+}
+
+static void
+ofp_print_geneve_table_reply(struct ds *s, const struct ofp_header *oh)
+{
+ int error;
+ struct ofputil_geneve_table_reply gtr;
+ struct ofputil_geneve_map *map;
+ int allocated_space = 0;
+
+ error = ofputil_decode_geneve_table_reply(oh, >r);
+ if (error) {
+ ofp_print_error(s, error);
+ return;
+ }
+
+ ds_put_char(s, '\n');
+
+ LIST_FOR_EACH (map, list_node, >r.mappings) {
+ allocated_space += map->option_len;
+ }
+
+ ds_put_format(s, " max option space=%"PRIu32" max fields=%"PRIu16"\n",
+ gtr.max_option_space, gtr.max_fields);
+ ds_put_format(s, " allocated option space=%d\n", allocated_space);
+ ds_put_char(s, '\n');
+ print_geneve_table(s, >r.mappings);
+
+ ofputil_uninit_geneve_table(>r.mappings);
+}
+
+/* This function will print the request forward message. The reason for
+ * request forward is taken from rf.request.type */
+static void
+ofp_print_requestforward(struct ds *string, const struct ofp_header *oh)
+{
+ struct ofputil_requestforward rf;
+ enum ofperr error;
+
+ error = ofputil_decode_requestforward(oh, &rf);
+ if (error) {
+ ofp_print_error(string, error);
+ return;
+ }
+
+ ds_put_cstr(string, " reason=");
+
+ switch (rf.reason) {
+ case OFPRFR_GROUP_MOD:
+ ds_put_cstr(string, "group_mod");
+ ofp_print_group_mod__(string, oh->version, rf.group_mod);
+ break;
+
+ case OFPRFR_METER_MOD:
+ ds_put_cstr(string, "meter_mod");
+ ofp_print_meter_mod__(string, rf.meter_mod);
+ break;
+ }
+ ofputil_destroy_requestforward(&rf);
+}
+