From 1242c6b6aa6325551fbcde141e9ba38ce7ff54b4 Mon Sep 17 00:00:00 2001 From: Magnus Henoch Date: Tue, 5 Nov 2013 12:20:31 +0000 Subject: [PATCH] Validate Push and Pop PBB actions This closes FlowForwarding/LINC-Switch#213. --- apps/linc_us4/src/linc_us4_flow.erl | 9 +++++++++ apps/linc_us4/test/linc_us4_flow_tests.erl | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/apps/linc_us4/src/linc_us4_flow.erl b/apps/linc_us4/src/linc_us4_flow.erl index 630ae9b..34014cc 100644 --- a/apps/linc_us4/src/linc_us4_flow.erl +++ b/apps/linc_us4/src/linc_us4_flow.erl @@ -865,6 +865,15 @@ validate_action(_SwitchId, #ofp_action_push_mpls{}, _Match) -> {error,{bad_action,bad_argument}}; validate_action(_SwitchId, #ofp_action_pop_mpls{}, _Match) -> ok; +validate_action(_SwitchId, #ofp_action_push_pbb{ethertype = Ether}, _Match) -> + case Ether of + 16#88e7 -> + ok; + _ -> + {error, {bad_action, bad_argument}} + end; +validate_action(_SwitchId, #ofp_action_pop_pbb{}, _Match) -> + ok; validate_action(_SwitchId, #ofp_action_set_field{field=Field}, Match) -> case are_prerequisites_met(Field,Match) of true -> diff --git a/apps/linc_us4/test/linc_us4_flow_tests.erl b/apps/linc_us4/test/linc_us4_flow_tests.erl index b547c91..efa5a4c 100644 --- a/apps/linc_us4/test/linc_us4_flow_tests.erl +++ b/apps/linc_us4/test/linc_us4_flow_tests.erl @@ -71,6 +71,8 @@ flow_mod_test_() -> ,{"Delete where meter", fun delete_where_meter/0} ,{"Add flow with an incompatible value/mask pair in the match", fun incompatible_value_mask_pair_in_match/0} + ,{"Validate push_pbb action", fun push_pbb_action/0} + ,{"Validate pop_pbb action", fun pop_pbb_action/0} ]}}. bad_table_id() -> @@ -1042,6 +1044,22 @@ incompatible_value_mask_pair_in_match() -> ?assertEqual({error, {bad_match, bad_wildcards}}, linc_us4_flow:modify(?SWITCH_ID, FlowModAdd)). +push_pbb_action() -> + FlowModAdd = #ofp_flow_mod{ + table_id = 0,command = add, + instructions = + [#ofp_instruction_apply_actions{ + actions = [#ofp_action_push_pbb{ethertype = 16#88e7}]}]}, + ?assertEqual(ok, linc_us4_flow:modify(?SWITCH_ID, FlowModAdd)). + +pop_pbb_action() -> + FlowModAdd = #ofp_flow_mod{ + table_id = 0,command = add, + instructions = + [#ofp_instruction_apply_actions{ + actions = [#ofp_action_pop_pbb{}]}]}, + ?assertEqual(ok, linc_us4_flow:modify(?SWITCH_ID, FlowModAdd)). + statistics_test_() -> {setup, fun setup/0, fun teardown/1, {foreach, fun foreach_setup/0, fun foreach_teardown/1,