[ovs-dev] [PATCH] doc: Add docs for linux-sfq QoS supported parameters

2017-12-17 Thread Lukasz Rzasik
Qdisc SFQ was already fully supported but ovs-vswtich.conf.db
lacked documentation about supported parameters.
This patch adds the documentation.

CC: Jonathan Vestin <jonav...@kau.se>
CC: Ben Pfaff <b...@ovn.org>
Signed-off-by: Lukasz Rzasik <lukasz.rza...@gmail.com>
---
 vswitchd/vswitch.xml | 19 +++
 1 file changed, 19 insertions(+)

diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
index 21ffaf5..018d644 100644
--- a/vswitchd/vswitch.xml
+++ b/vswitchd/vswitch.xml
@@ -3949,6 +3949,25 @@ ovs-vsctl add-port br0 p0 -- set Interface p0 type=patch 
options:peer=p1 \
   
 
 
+
+  
+The linux-sfq QoS supports the following key-value pairs:
+  
+
+  
+Number of seconds between consecutive perturbations in hashing 
algorithm.
+Different flows can end up in the same hash bucket causing unfairness.
+Perturbation's goal is to remove possible unfairness.
+The default and recommended value is 10. Too low a value is discouraged
+because each perturbation can cause packet reordering.
+  
+  
+Number of bytes linux-sfq QoS can dequeue in one turn in
+round-robin from one flow. The default and recommended value is equal
+to interface's MTU.
+  
+
+
 
   The overall purpose of these columns is described under Common
   Columns at the beginning of this document.
-- 
2.11.0

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


[ovs-dev] [PATCH] ofproto-dpif: Send QinQ related sFlow counters

2017-04-18 Thread Lukasz Rzasik
This patch implements QinQ related sFlow counters.
It is implemented according to sFlow Version 5,
http://www.sflow.org/sflow_version_5.txt
Open vSwitch will send a stack of stripped VLAN tags
to sFlow collector if the original packets have multiple
VLAN tags.

Unit tests have been updated accordingly.

The patch is based on commit f0fb825a37 (Add support
for 802.1ad (QinQ tunneling))

Signed-off-by: Lukasz Rzasik <lukaszx.rza...@intel.com>
CC: Thomas F Herbert <thomasfherb...@gmail.com>
CC: Xiao Liang <shaw.l...@gmail.com>
CC: Eric Garver <e...@erig.me>
CC: Neil McKee <neil.mc...@inmon.com>
---
 lib/packets.h|  4 +++
 ofproto/ofproto-dpif-sflow.c | 60 +---
 ofproto/ofproto-dpif-sflow.h |  9 +
 tests/ofproto-dpif.at| 83 
 tests/test-sflow.c   | 25 +
 5 files changed, 177 insertions(+), 4 deletions(-)

diff --git a/lib/packets.h b/lib/packets.h
index 755f08d..7555dfc 100644
--- a/lib/packets.h
+++ b/lib/packets.h
@@ -384,6 +384,10 @@ static inline bool eth_type_vlan(ovs_be16 eth_type)
 eth_type == htons(ETH_TYPE_VLAN_8021AD);
 }
 
+static inline bool eth_type_8021Q(ovs_be16 eth_type)
+{
+return eth_type == htons(ETH_TYPE_VLAN_8021Q);
+}
 
 /* Minimum value for an Ethernet type.  Values below this are IEEE 802.2 frame
  * lengths. */
diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c
index 59fafa1..41972e2 100644
--- a/ofproto/ofproto-dpif-sflow.c
+++ b/ofproto/ofproto-dpif-sflow.c
@@ -1084,6 +1084,31 @@ dpif_sflow_capture_input_mpls(const struct flow *flow,
 }
 }
 
+static void
+dpif_sflow_pop_vlan(const struct flow *flow,
+struct dpif_sflow_actions *sflow_actions)
+{
+union flow_vlan_hdr vlan = flow->vlans[0];
+if (eth_type_vlan(vlan.tpid)) {
+int depth = 0;
+int ii;
+/* Calculate depth by detecting 8021Q TPID. */
+for (ii = 0; ii < FLOW_MAX_VLAN_HEADERS; ii++) {
+vlan = flow->vlans[ii];
+depth++;
+if (eth_type_8021Q(vlan.tpid)) {
+break;
+}
+}
+
+if (depth > 1) {
+sflow_actions->vlan_qtag[sflow_actions->vlan_stack_depth] =
+ntohl(flow->vlans[sflow_actions->vlan_stack_depth].qtag);
+sflow_actions->vlan_stack_depth++;
+}
+}
+}
+
 void
 dpif_sflow_read_actions(const struct flow *flow,
const struct nlattr *actions, size_t actions_len,
@@ -1170,11 +1195,10 @@ dpif_sflow_read_actions(const struct flow *flow,
break;
 
case OVS_ACTION_ATTR_PUSH_VLAN:
+break;
+
case OVS_ACTION_ATTR_POP_VLAN:
-   /* TODO: 802.1AD(QinQ) is not supported by OVS (yet), so do not
-* construct a VLAN-stack. The sFlow user-action cookie already
-* captures the egress VLAN ID so there is nothing more to do here.
-*/
+dpif_sflow_pop_vlan(flow, sflow_actions);
break;
 
case OVS_ACTION_ATTR_PUSH_MPLS: {
@@ -1225,6 +1249,19 @@ dpif_sflow_encode_mpls_stack(SFLLabelStack *stack,
 stack->stack[stack->depth - 1] |= MPLS_BOS_MASK;
 }
 
+static void
+dpif_sflow_encode_vlan_stack(SFLVlanStack *stack,
+ uint32_t *vlans_buf,
+ const struct dpif_sflow_actions *sflow_actions)
+{
+int ii;
+stack->depth = sflow_actions->vlan_stack_depth;
+stack->stack = vlans_buf;
+for (ii = 0; ii < stack->depth; ii++) {
+stack->stack[ii] = sflow_actions->vlan_qtag[ii];
+}
+}
+
 /* Extract the output port count from the user action cookie.
  * See http://sflow.org/sflow_version_5.txt "Input/Output port information"
  */
@@ -1258,6 +1295,8 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct 
dp_packet *packet,
 SFLFlow_sample_element vniInElem, vniOutElem;
 SFLFlow_sample_element mplsElem;
 uint32_t mpls_lse_buf[FLOW_MAX_MPLS_LABELS];
+SFLFlow_sample_element vlanTunnelElem;
+uint32_t vlans_buf[FLOW_MAX_VLAN_HEADERS];
 SFLSampler *sampler;
 struct dpif_sflow_port *in_dsp;
 struct dpif_sflow_port *out_dsp;
@@ -1372,6 +1411,19 @@ dpif_sflow_received(struct dpif_sflow *ds, const struct 
dp_packet *packet,
SFLADD_ELEMENT(, );
 }
 
+/* stripped VLAN tags stack. */
+if (sflow_actions
+&& sflow_actions->vlan_stack_depth > 0
+&& dpif_sflow_cookie_num_outputs(cookie) == 1) {
+memset(, 0, sizeof(vlanTunnelElem));
+vlanTunnelElem.tag = SFLFLOW_EX_VLAN_TUNNEL;
+dpif_sflow_encode_vlan_stack(
+ _tunnel.stack,
+ vlans_buf,
+ sflow_actions);
+SFLADD_ELEMENT(, );
+}
+
 /* Submit the flow sample to be en

[ovs-dev] [PATCH] ovsdb-data: Add support for integer ranges in database commands

2016-12-29 Thread Lukasz Rzasik
Adding / removing a range of integers to a column accepting a set of
integers requires enumarating all of the integers. This patch simplifies
it by introducing 'range' concept to the database commands. Two integers
separated by a hyphen represent an inclusive range.

The patch adds positive and negative tests for the new syntax.
The patch was tested by 'make check'. Covarage was tested by
'make check-lcov'.

Signed-off-by: Lukasz Rzasik <lukasz.rza...@gmail.com>
Suggested-by: <my_ovs_disc...@yahoo.com>
Suggested-by: Ben Pfaff <b...@ovn.org>
---
 lib/db-ctl-base.c   |  10 +--
 lib/db-ctl-base.man |   6 +-
 lib/ovsdb-data.c| 201 +++-
 lib/ovsdb-data.h|  17 -
 lib/util.c  |  34 -
 lib/util.h  |   2 +
 tests/ovs-vsctl.at  |   2 +-
 tests/ovsdb-data.at |  69 +-
 tests/test-ovsdb.c  |  16 -
 9 files changed, 291 insertions(+), 66 deletions(-)

diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c
index 02eb328..e32e945 100644
--- a/lib/db-ctl-base.c
+++ b/lib/db-ctl-base.c
@@ -677,7 +677,7 @@ is_condition_satisfied(const struct ctl_table_class *table,
   column->name);
 }
 
-die_if_error(ovsdb_atom_from_string(_key, >type.key,
+die_if_error(ovsdb_atom_from_string(_key, NULL, >type.key,
 key_string, symtab));
 
 type.key = type.value;
@@ -823,7 +823,7 @@ cmd_get(struct ctl_context *ctx)
   column->name);
 }
 
-die_if_error(ovsdb_atom_from_string(,
+die_if_error(ovsdb_atom_from_string(, NULL,
 >type.key,
 key_string, ctx->symtab));
 
@@ -1118,13 +1118,13 @@ set_column(const struct ctl_table_class *table,
   column->name);
 }
 
-die_if_error(ovsdb_atom_from_string(, >type.key,
+die_if_error(ovsdb_atom_from_string(, NULL, >type.key,
 key_string, symtab));
-die_if_error(ovsdb_atom_from_string(, >type.value,
+die_if_error(ovsdb_atom_from_string(, NULL, >type.value,
 value_string, symtab));
 
 ovsdb_datum_init_empty();
-ovsdb_datum_add_unsafe(, , , >type);
+ovsdb_datum_add_unsafe(, , , >type, NULL);
 
 ovsdb_atom_destroy(, column->type.key.type);
 ovsdb_atom_destroy(, column->type.value.type);
diff --git a/lib/db-ctl-base.man b/lib/db-ctl-base.man
index 7b30501..26828d6 100644
--- a/lib/db-ctl-base.man
+++ b/lib/db-ctl-base.man
@@ -29,7 +29,11 @@ single comma.  When multiple values are present, duplicates 
are not
 allowed, and order is not important.  Conversely, some database
 columns can have an empty set of values, represented as \fB[]\fR, and
 square brackets may optionally enclose other non-empty sets or single
-values as well.
+values as well. For a column accepting a set of integers, database commands
+accept a range. A range is represented by two integers separated by
+\fB-\fR. A range is inclusive. A range have a maximum size of 4096
+elements. If more elements are needed, they can be specified in seperate
+ranges.
 .PP
 A few database columns are ``maps'' of key-value pairs, where the key
 and the value are each some fixed database type.  These are specified
diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c
index 0dda73a..a7a6eef 100644
--- a/lib/ovsdb-data.c
+++ b/lib/ovsdb-data.c
@@ -305,6 +305,25 @@ ovsdb_symbol_referenced(struct ovsdb_symbol *symbol,
 }
 }
 
+static union ovsdb_atom *
+alloc_default_atoms(enum ovsdb_atomic_type type, size_t n)
+{
+if (type != OVSDB_TYPE_VOID && n) {
+union ovsdb_atom *atoms;
+unsigned int i;
+
+atoms = xmalloc(n * sizeof *atoms);
+for (i = 0; i < n; i++) {
+ovsdb_atom_init_default([i], type);
+}
+return atoms;
+} else {
+/* Avoid wasting memory in the n == 0 case, because xmalloc(0) is
+ * treated as xmalloc(1). */
+return NULL;
+}
+}
+
 static struct ovsdb_error * OVS_WARN_UNUSED_RESULT
 ovsdb_atom_parse_uuid(struct uuid *uuid, const struct json *json,
   struct ovsdb_symbol_table *symtab,
@@ -468,6 +487,7 @@ ovsdb_atom_to_json(const union ovsdb_atom *atom, enum 
ovsdb_atomic_type type)
 
 static char *
 ovsdb_atom_from_string__(union ovsdb_atom *atom,
+ union ovsdb_atom **range_end_atom,
  const struct ovsdb_base_type *base, const char *s,
  struct ovsdb_symbol_table *symtab)
 {
@@ -478,9 +498,20 @@ ovsdb_atom_from_string__(union ovsdb_atom *atom,
 OVS_NOT_REACHED();
 
 case OVSDB_TYPE_INTEGER: {
-long long int integer;
-if (!str_to_llong(s,