Use the new OVS_FLOW_ATTR_SILENT flag when probing for datapath feature support. Suppress also dpif error logging when requested, as probe failures are already logged at ofproto-dpif.
Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> --- lib/dpif-linux.c | 11 +++++++++++ lib/dpif.c | 6 ++++-- lib/dpif.h | 4 +++- ofproto/ofproto-dpif-upcall.c | 1 + ofproto/ofproto-dpif.c | 7 +++++-- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/lib/dpif-linux.c b/lib/dpif-linux.c index 2c387ed..256112d 100644 --- a/lib/dpif-linux.c +++ b/lib/dpif-linux.c @@ -114,6 +114,7 @@ struct dpif_linux_flow { const uint8_t *tcp_flags; /* OVS_FLOW_ATTR_TCP_FLAGS. */ const ovs_32aligned_u64 *used; /* OVS_FLOW_ATTR_USED. */ bool clear; /* OVS_FLOW_ATTR_CLEAR. */ + bool silent; /* OVS_FLOW_ATTR_SILENT. */ }; static void dpif_linux_flow_init(struct dpif_linux_flow *); @@ -1093,6 +1094,9 @@ dpif_linux_init_flow_put(struct dpif_linux *dpif, const struct dpif_flow_put *pu if (put->flags & DPIF_FP_ZERO_STATS) { request->clear = true; } + if (put->flags & DPIF_FP_SILENT) { + request->silent = true; + } request->nlmsg_flags = put->flags & DPIF_FP_MODIFY ? 0 : NLM_F_CREATE; } @@ -1298,6 +1302,9 @@ dpif_linux_encode_execute(int dp_ifindex, const struct dpif_execute *d_exec, nl_msg_put_unspec(buf, OVS_PACKET_ATTR_ACTIONS, d_exec->actions, d_exec->actions_len); + if (d_exec->silent) { + nl_msg_put_flag(buf, OVS_FLOW_ATTR_SILENT); + } } #define MAX_OPS 50 @@ -2275,6 +2282,7 @@ dpif_linux_flow_from_ofpbuf(struct dpif_linux_flow *flow, [OVS_FLOW_ATTR_TCP_FLAGS] = { .type = NL_A_U8, .optional = true }, [OVS_FLOW_ATTR_USED] = { .type = NL_A_U64, .optional = true }, /* The kernel never uses OVS_FLOW_ATTR_CLEAR. */ + /* The kernel never uses OVS_FLOW_ATTR_SILENT. */ }; struct nlattr *a[ARRAY_SIZE(ovs_flow_policy)]; @@ -2357,6 +2365,9 @@ dpif_linux_flow_to_ofpbuf(const struct dpif_linux_flow *flow, if (flow->clear) { nl_msg_put_flag(buf, OVS_FLOW_ATTR_CLEAR); } + if (flow->silent) { + nl_msg_put_flag(buf, OVS_FLOW_ATTR_SILENT); + } } /* Clears 'flow' to "empty" values. */ diff --git a/lib/dpif.c b/lib/dpif.c index bf2c5f9..c72c6d3 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -1026,6 +1026,7 @@ dpif_execute_helper_cb(void *aux_, struct dpif_packet **packets, int cnt, execute.packet = packet; execute.md = *md; execute.needs_help = false; + execute.silent = false; aux->error = dpif_execute(aux->dpif, &execute); log_execute_message(aux->dpif, &execute, true, aux->error); @@ -1484,7 +1485,7 @@ static void log_flow_put_message(struct dpif *dpif, const struct dpif_flow_put *put, int error) { - if (should_log_flow_message(error)) { + if (should_log_flow_message(error) && !(put->flags & DPIF_FP_SILENT)) { struct ds s; ds_init(&s); @@ -1536,7 +1537,8 @@ static void log_execute_message(struct dpif *dpif, const struct dpif_execute *execute, bool subexecute, int error) { - if (!(error ? VLOG_DROP_WARN(&error_rl) : VLOG_DROP_DBG(&dpmsg_rl))) { + if (!(error ? VLOG_DROP_WARN(&error_rl) : VLOG_DROP_DBG(&dpmsg_rl)) + && !execute->silent) { struct ds ds = DS_EMPTY_INITIALIZER; char *packet; diff --git a/lib/dpif.h b/lib/dpif.h index be1bc4f..fab59d4 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -511,7 +511,8 @@ void dpif_flow_stats_format(const struct dpif_flow_stats *, struct ds *); enum dpif_flow_put_flags { DPIF_FP_CREATE = 1 << 0, /* Allow creating a new flow. */ DPIF_FP_MODIFY = 1 << 1, /* Allow modifying an existing flow. */ - DPIF_FP_ZERO_STATS = 1 << 2 /* Zero the stats of an existing flow. */ + DPIF_FP_ZERO_STATS = 1 << 2, /* Zero the stats of an existing flow. */ + DPIF_FP_SILENT = 1 << 3 /* Suppress error messages, if any. */ }; int dpif_flow_flush(struct dpif *); @@ -662,6 +663,7 @@ struct dpif_execute { const struct nlattr *actions; /* Actions to execute on packet. */ size_t actions_len; /* Length of 'actions' in bytes. */ bool needs_help; + bool silent; /* Suppress error messages. */ /* Input, but possibly modified as a side effect of execution. */ struct ofpbuf *packet; /* Packet to execute. */ diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index 8e890f8..be10fdc 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -1137,6 +1137,7 @@ handle_upcalls(struct udpif *udpif, struct upcall *upcalls, op->u.execute.actions = ofpbuf_data(upcall->xout.odp_actions); op->u.execute.actions_len = ofpbuf_size(upcall->xout.odp_actions); op->u.execute.needs_help = (upcall->xout.slow & SLOW_ACTION) != 0; + op->u.execute.silent = false; } } diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c index fc01bef..1458c02 100644 --- a/ofproto/ofproto-dpif.c +++ b/ofproto/ofproto-dpif.c @@ -987,7 +987,7 @@ check_recirc(struct dpif_backer *backer) ofpbuf_use_stack(&key, &keybuf, sizeof keybuf); odp_flow_key_from_flow(&key, &flow, NULL, 0, true); - error = dpif_flow_put(backer->dpif, DPIF_FP_CREATE, + error = dpif_flow_put(backer->dpif, DPIF_FP_CREATE | DPIF_FP_SILENT, ofpbuf_data(&key), ofpbuf_size(&key), NULL, 0, NULL, 0, NULL); if (error && error != EEXIST) { @@ -1063,6 +1063,7 @@ check_variable_length_userdata(struct dpif_backer *backer) execute.packet = &packet; execute.md = PKT_METADATA_INITIALIZER(0); execute.needs_help = false; + execute.silent = true; error = dpif_execute(backer->dpif, &execute); @@ -1115,7 +1116,7 @@ check_max_mpls_depth(struct dpif_backer *backer) ofpbuf_use_stack(&key, &keybuf, sizeof keybuf); odp_flow_key_from_flow(&key, &flow, NULL, 0, false); - error = dpif_flow_put(backer->dpif, DPIF_FP_CREATE, + error = dpif_flow_put(backer->dpif, DPIF_FP_CREATE | DPIF_FP_SILENT, ofpbuf_data(&key), ofpbuf_size(&key), NULL, 0, NULL, 0, NULL); if (error && error != EEXIST) { @@ -1174,6 +1175,7 @@ check_masked_set_action(struct dpif_backer *backer) execute.packet = &packet; execute.md = PKT_METADATA_INITIALIZER(0); execute.needs_help = false; + execute.silent = true; error = dpif_execute(backer->dpif, &execute); @@ -3475,6 +3477,7 @@ ofproto_dpif_execute_actions(struct ofproto_dpif *ofproto, execute.packet = packet; execute.md = pkt_metadata_from_flow(flow); execute.needs_help = (xout.slow & SLOW_ACTION) != 0; + execute.silent = false; /* Fix up in_port. */ in_port = flow->in_port.ofp_port; -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev