rstp: Show some useful rstp port fields.

designated_bridge_id, designated_port_id and designated_path_cost are
now displayed in rstp_status when using 'ovs-vsctl list port'.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
tests: Skip tunnel-push-pop test on Windows and BSD.

Also updates ovs-router README documentation.

Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
Acked-by: YAMAMOTO Takashi <yamamoto@valinux.co.jp>
rstp: Show some useful rstp port fields.

designated_bridge_id, designated_port_id and designated_path_cost are
now displayed in rstp_status when using 'ovs-vsctl list port'.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp: Add 'rstp-admin-p2p-mac' and 'rstp-admin-port-state' setters.

'rstp-admin-port-state' is the Administrative Bridge Port state
variable defined in the 802.1D-2004 standard.  It can be set to
include or exclude a port from the active topology by management
(section 7.4).

operPointToPointMAC and 'rstp-admin-p2p-mac' are a pair of parameters
that permit inspection of, and control over, the administrative and
operational state of the point-to-point status of the MAC entity by
the MAC Relay Entity.  adminPointToPointMAC can be set by management
and its value is reflected on operPointToPointMAC.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp-state-machines: Fix reception of BPDUs conveying an unknown port role.

If the Unknown value of the Port Role parameter is received, the state
machines should treat the RST BPDU as if it were a Configuration BPDU.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp-state-machines: Fix compare_rstp_priority_vector().

The bridge_port_id is never conveyed in Configuration Messages, but is
used as a tie-breaker within a Bridge.  This patch extends the
comparison to this fifth field in a rstp_priority_vector.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp-state-machines: Fix Topology Change State Machine transition.

Accordingly to the 802.1D-2004 standard, the transition from the
TOPOLOGY_CHANGE_SM_NOTIFIED_TCN_EXEC state should go to the
TOPOLOGY_CHANGE_SM_NOTIFIED_TC_EXEC state and not to the
TOPOLOGY_CHANGE_SM_ACTIVE.

See section 17.31 of 802.1D-2004 standard.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp-state-machines: Fix updt_roles_tree().

If the DesignatedBridgeID Bridge Address component is equal to that
component of the Bridge's own bridge priority vector skip to the next
port.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp-state-machines: Rename ALTERNATE_AGREED state as ALTERNATE_AGREED_EXEC.

All other similar port_role_transition_sm states are named according
to this pattern.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp-state-machines: fix TCN reception.

Set rcdv_tcn and return OTHER_INFO when a
TOPOLOGY_CHANGE_NOTIFICATION_BPDU is received, as required by
802.1Q-2008.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp: Invoke updt_roles_tree__() in max_age and forward_delay setters.

This patch was necessary in a test on the acceptable range values of
max_age and forward_delay.  Since rstp_set_bridge_max_age__() and
rstp_set_bridge_forward_delay__() set the rstp->bridge_max_age and
rstp->bridge_forward_delay variables, it was necessary to call
updt_roles_tree__() to immediately update p->designated_times, used in
tx_rstp() (in lib/rstp-state-machines.c).  After this change the
validation software received the expected maxAge and forwardDelay
values.  Otherwise, such test failed.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
stp,rstp: disable learning and forwarding in STP/RSTP disabled state.

There is a difference between a port with STP/RSTP protocol enabled and a
disabled role and a port which has a disabled role because STP/RSTP is
not active.  This commit ensure to make such distinction.

Standard 802.1D claims that the Topology Change state machine (17.31)
treats a Port as no longer active when it becomes an Alternate, Backup,
or Disabled Port and stops learning from received frames.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp: Refactor rstp_check_and_reset_fdb_flush().

With this commit, RSTP is able to flush from the MAC learning table
entries pertaining to a single port.  Before this commit the whole
table was flushed every time a port requested flushing actions.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp: Refactor rstp_port_set_administrative_bridge_port__().

Invoke move_rstp__() in rstp_port_set_administrative_bridge_port__()
if port is not initializing.  This is necessary in a test that checks
that a Port becoming alternate/backup/disabled stops learning and
forwarding.  The move_rstp__() call is necessary to immediatly disable
learning and forwarding on that port.  Without this, the test fails.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
rstp-state-machines: fix rcv_info().

A Config BPDU always conveys a Designated Port Role.

Signed-off-by: Daniele Venturino <daniele.venturino@m3s.it>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
datapath-windows: Remove all duplicate checks for NULL.

Right now the gOvsSwitchContext pointer is checked against NULL
in a lot of places of the OVS extension code. This check should
be done only once to avoid wasteful checks. Thus I have added the
check in the dispatch routine, before doing any processing, and
removed all other checks from the rest of the code.

Signed-off-by: Sorin Vinturis <svinturis@cloudbasesolutions.com>
Acked-by: Eitan Eliahu <eliahue@vmware.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
classifier: Do not insert duplicate rules in indices.

There is no point in adding duplicate information into prefix tries.

Also, since the lower-priority duplicate rules are not visible to
lookups, they do not need to be in staged lookup indices directly
either (the head rule is).

Finally, now that cmap operations return the number of elements in the
cmap, subtable's 'n_rules' member is not needed any more.

Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
classifier: Lockless and robust classifier iteration.

Previously, accurate iteration required writers to be excluded during
iteration.  This patch adds an rculist to struct cls_subtable, and a
corresponding list node to struct cls_rule, which makes iteration more
straightforward, and allows the iterators to remain ignorant of the
internals of the cls_match.  This new list allows iteration of rules
in the classifier by traversing the RCU-friendly subtables vector, and
the rculist of rules in each subtable.

Classifier modifications may be performed concurrently, but whether or
not the concurrent iterator sees those changes depends on the timing
of change.  More specifically, an concurrent iterator:

- May or may not see a rule that is being inserted or removed.
- Will see either the new or the old version of a rule that is replaced.
- Will see all the other rules (that are not being modified).

Finally, The subtable's rculist also allows to make
classifier_rule_overlaps() lockless, which this patch also does.

Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
classifier: Remove internal mutex.

Almost all classifier users already exclude concurrent modifications,
or are single-threaded, hence the classifier internal mutex can be
removed.  Due to this change, ovs-router.c and tnl-ports.c need new
mutexes, which are added.

As noted by Ben in review, ovs_router_flush() should also free the
entries it removes from the classifier.  It now calls
ovsrcu_postpone() to that effect.

Suggested-by: Ben Pfaff <blp@nicira.com>
Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
classifier: Make insert and replace take a const rule, too.

classifier_remove() was recently changed to take a const struct
cls_rule *.  Make the corresponding change to classifier_replace() and
classifier_insert().  This simplifies existing calling sites in
ofproto.

Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>