diff options
author | Anju Thomas <anju.thomas@ericsson.com> | 2019-12-18 05:48:12 +0100 |
---|---|---|
committer | Ilya Maximets <i.maximets@ovn.org> | 2020-01-07 17:01:42 +0100 |
commit | a13a0209750c424556189796061c40d08c689467 (patch) | |
tree | 32b4f84fdc418f497b25a41828dd7788aa0f20d8 /ofproto/ofproto-dpif-xlate.c | |
parent | 924d94a695a6ca54b83d4bd42ec196ba53947c6d (diff) | |
download | openvswitch-a13a0209750c424556189796061c40d08c689467.tar.gz |
userspace: Improved packet drop statistics.
Currently OVS maintains explicit packet drop/error counters only on port
level. Packets that are dropped as part of normal OpenFlow processing
are counted in flow stats of “drop” flows or as table misses in table
stats. These can only be interpreted by controllers that know the
semantics of the configured OpenFlow pipeline. Without that knowledge,
it is impossible for an OVS user to obtain e.g. the total number of
packets dropped due to OpenFlow rules.
Furthermore, there are numerous other reasons for which packets can be
dropped by OVS slow path that are not related to the OpenFlow pipeline.
The generated datapath flow entries include a drop action to avoid
further expensive upcalls to the slow path, but subsequent packets
dropped by the datapath are not accounted anywhere.
Finally, the datapath itself drops packets in certain error situations.
Also, these drops are today not accounted for.This makes it difficult
for OVS users to monitor packet drop in an OVS instance and to alert a
management system in case of a unexpected increase of such drops.
Also OVS trouble-shooters face difficulties in analysing packet drops.
With this patch we implement following changes to address the issues
mentioned above.
1. Identify and account all the silent packet drop scenarios
2. Display these drops in ovs-appctl coverage/show
Co-authored-by: Rohith Basavaraja <rohith.basavaraja@gmail.com>
Co-authored-by: Keshav Gupta <keshugupta1@gmail.com>
Signed-off-by: Anju Thomas <anju.thomas@ericsson.com>
Signed-off-by: Rohith Basavaraja <rohith.basavaraja@gmail.com>
Signed-off-by: Keshav Gupta <keshugupta1@gmail.com>
Acked-by: Eelco Chaudron <echaudro@redhat.com
Acked-by: Ben Pfaff <blp@ovn.org>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Diffstat (limited to 'ofproto/ofproto-dpif-xlate.c')
-rw-r--r-- | ofproto/ofproto-dpif-xlate.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c index 1c7269317..4407f9c97 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -445,6 +445,12 @@ const char *xlate_strerror(enum xlate_error error) return "Invalid tunnel metadata"; case XLATE_UNSUPPORTED_PACKET_TYPE: return "Unsupported packet type"; + case XLATE_CONGESTION_DROP: + return "Congestion Drop"; + case XLATE_FORWARDING_DISABLED: + return "Forwarding is disabled"; + case XLATE_MAX: + break; } return "Unknown error"; } @@ -6010,6 +6016,12 @@ put_ct_label(const struct flow *flow, struct ofpbuf *odp_actions, } static void +put_drop_action(struct ofpbuf *odp_actions, enum xlate_error error) +{ + nl_msg_put_u32(odp_actions, OVS_ACTION_ATTR_DROP, error); +} + +static void put_ct_helper(struct xlate_ctx *ctx, struct ofpbuf *odp_actions, struct ofpact_conntrack *ofc) { @@ -7646,8 +7658,9 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) compose_ipfix_action(&ctx, ODPP_NONE); } size_t sample_actions_len = ctx.odp_actions->size; + bool ecn_drop = !tnl_process_ecn(flow); - if (tnl_process_ecn(flow) + if (!ecn_drop && (!in_port || may_receive(in_port, &ctx))) { const struct ofpact *ofpacts; size_t ofpacts_len; @@ -7679,6 +7692,7 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) ctx.odp_actions->size = sample_actions_len; ctx_cancel_freeze(&ctx); ofpbuf_clear(&ctx.action_set); + ctx.error = XLATE_FORWARDING_DISABLED; } if (!ctx.freezing) { @@ -7687,6 +7701,8 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) if (ctx.freezing) { finish_freezing(&ctx); } + } else if (ecn_drop) { + ctx.error = XLATE_CONGESTION_DROP; } /* Output only fully processed packets. */ @@ -7792,6 +7808,21 @@ exit: ofpbuf_clear(xin->odp_actions); } } + + /* Install drop action if datapath supports explicit drop action. */ + if (xin->odp_actions && !xin->odp_actions->size && + ovs_explicit_drop_action_supported(ctx.xbridge->ofproto)) { + put_drop_action(xin->odp_actions, ctx.error); + } + + /* Since congestion drop and forwarding drop are not exactly + * translation error, we are resetting the translation error. + */ + if (ctx.error == XLATE_CONGESTION_DROP || + ctx.error == XLATE_FORWARDING_DISABLED) { + ctx.error = XLATE_OK; + } + return ctx.error; } |