Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 1 | /* |
2 | * Copyright 2017-present Open Networking Foundation | ||||
3 | * | ||||
4 | * Licensed under the Apache License, Version 2.0 (the "License"); | ||||
5 | * you may not use this file except in compliance with the License. | ||||
6 | * You may obtain a copy of the License at | ||||
7 | * | ||||
8 | * http://www.apache.org/licenses/LICENSE-2.0 | ||||
9 | * | ||||
10 | * Unless required by applicable law or agreed to in writing, software | ||||
11 | * distributed under the License is distributed on an "AS IS" BASIS, | ||||
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
13 | * See the License for the specific language governing permissions and | ||||
14 | * limitations under the License. | ||||
15 | */ | ||||
16 | |||||
17 | #include <core.p4> | ||||
18 | #include <v1model.p4> | ||||
19 | |||||
20 | #include "../define.p4" | ||||
21 | #include "../header.p4" | ||||
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 22 | |
23 | |||||
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 24 | control Forwarding (inout parsed_headers_t hdr, |
25 | inout fabric_metadata_t fabric_metadata, | ||||
26 | inout standard_metadata_t standard_metadata) { | ||||
27 | |||||
28 | @hidden | ||||
29 | action set_next_id(next_id_t next_id) { | ||||
30 | fabric_metadata.next_id = next_id; | ||||
31 | } | ||||
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 32 | |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 33 | /* |
34 | * Bridging Table. | ||||
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 35 | */ |
Yi Tseng | 3a5731e | 2018-01-22 11:38:58 -0800 | [diff] [blame] | 36 | direct_counter(CounterType.packets_and_bytes) bridging_counter; |
Yi Tseng | 3a5731e | 2018-01-22 11:38:58 -0800 | [diff] [blame] | 37 | |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 38 | action set_next_id_bridging(next_id_t next_id) { |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 39 | set_next_id(next_id); |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 40 | bridging_counter.count(); |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 41 | } |
42 | |||||
Carmelo Cascone | 70e816b | 2019-03-19 16:15:47 -0700 | [diff] [blame] | 43 | // FIXME: using ternary for eth_dst prevents our ability to scale in |
44 | // bridging heavy environments. Do we really need ternary? Can we come up | ||||
45 | // with a multi-table/algorithmic approach? | ||||
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 46 | table bridging { |
47 | key = { | ||||
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 48 | fabric_metadata.vlan_id: exact @name("vlan_id"); |
49 | hdr.ethernet.dst_addr: ternary @name("eth_dst"); | ||||
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 50 | } |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 51 | actions = { |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 52 | set_next_id_bridging; |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 53 | @defaultonly nop; |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 54 | } |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 55 | const default_action = nop(); |
Yi Tseng | 3a5731e | 2018-01-22 11:38:58 -0800 | [diff] [blame] | 56 | counters = bridging_counter; |
Carmelo Cascone | 70e816b | 2019-03-19 16:15:47 -0700 | [diff] [blame] | 57 | size = BRIDGING_TABLE_SIZE; |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 58 | } |
59 | |||||
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 60 | /* |
61 | * MPLS Table. | ||||
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 62 | */ |
63 | direct_counter(CounterType.packets_and_bytes) mpls_counter; | ||||
64 | |||||
65 | action pop_mpls_and_next(next_id_t next_id) { | ||||
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 66 | fabric_metadata.mpls_label = 0; |
67 | set_next_id(next_id); | ||||
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 68 | mpls_counter.count(); |
69 | } | ||||
70 | |||||
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 71 | table mpls { |
72 | key = { | ||||
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 73 | fabric_metadata.mpls_label: exact @name("mpls_label"); |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 74 | } |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 75 | actions = { |
76 | pop_mpls_and_next; | ||||
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 77 | @defaultonly nop; |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 78 | } |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 79 | const default_action = nop(); |
Yi Tseng | 3a5731e | 2018-01-22 11:38:58 -0800 | [diff] [blame] | 80 | counters = mpls_counter; |
Carmelo Cascone | 70e816b | 2019-03-19 16:15:47 -0700 | [diff] [blame] | 81 | size = MPLS_TABLE_SIZE; |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 82 | } |
83 | |||||
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 84 | /* |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 85 | * IPv4 Routing Table. |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 86 | */ |
Daniele Moro | 693d76f | 2019-09-24 14:34:07 -0700 | [diff] [blame^] | 87 | #ifdef WTIH_DEBUG |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 88 | direct_counter(CounterType.packets_and_bytes) routing_v4_counter; |
Daniele Moro | 693d76f | 2019-09-24 14:34:07 -0700 | [diff] [blame^] | 89 | #endif // WITH_DEBUG |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 90 | |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 91 | action set_next_id_routing_v4(next_id_t next_id) { |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 92 | set_next_id(next_id); |
Daniele Moro | 693d76f | 2019-09-24 14:34:07 -0700 | [diff] [blame^] | 93 | #ifdef WTIH_DEBUG |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 94 | routing_v4_counter.count(); |
Daniele Moro | 693d76f | 2019-09-24 14:34:07 -0700 | [diff] [blame^] | 95 | #endif // WITH_DEBUG |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 96 | } |
97 | |||||
Charles Chan | cd03f07 | 2018-08-31 17:46:37 -0700 | [diff] [blame] | 98 | action nop_routing_v4() { |
Daniele Moro | 693d76f | 2019-09-24 14:34:07 -0700 | [diff] [blame^] | 99 | // no-op |
100 | #ifdef WTIH_DEBUG | ||||
Charles Chan | cd03f07 | 2018-08-31 17:46:37 -0700 | [diff] [blame] | 101 | routing_v4_counter.count(); |
Daniele Moro | 693d76f | 2019-09-24 14:34:07 -0700 | [diff] [blame^] | 102 | #endif // WITH_DEBUG |
Charles Chan | cd03f07 | 2018-08-31 17:46:37 -0700 | [diff] [blame] | 103 | } |
104 | |||||
Carmelo Cascone | 70e816b | 2019-03-19 16:15:47 -0700 | [diff] [blame] | 105 | #ifdef _ROUTING_V4_TABLE_ANNOT |
106 | _ROUTING_V4_TABLE_ANNOT | ||||
107 | #endif | ||||
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 108 | table routing_v4 { |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 109 | key = { |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 110 | hdr.ipv4.dst_addr: lpm @name("ipv4_dst"); |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 111 | } |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 112 | actions = { |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 113 | set_next_id_routing_v4; |
Charles Chan | cd03f07 | 2018-08-31 17:46:37 -0700 | [diff] [blame] | 114 | nop_routing_v4; |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 115 | @defaultonly nop; |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 116 | } |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 117 | const default_action = nop(); |
Daniele Moro | 693d76f | 2019-09-24 14:34:07 -0700 | [diff] [blame^] | 118 | #ifdef WTIH_DEBUG |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 119 | counters = routing_v4_counter; |
Daniele Moro | 693d76f | 2019-09-24 14:34:07 -0700 | [diff] [blame^] | 120 | #endif // WITH_DEBUG |
Carmelo Cascone | 70e816b | 2019-03-19 16:15:47 -0700 | [diff] [blame] | 121 | size = ROUTING_V4_TABLE_SIZE; |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 122 | } |
123 | |||||
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 124 | #ifdef WITH_IPV6 |
125 | /* | ||||
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 126 | * IPv6 Routing Table. |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 127 | */ |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 128 | direct_counter(CounterType.packets_and_bytes) routing_v6_counter; |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 129 | |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 130 | action set_next_id_routing_v6(next_id_t next_id) { |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 131 | set_next_id(next_id); |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 132 | routing_v6_counter.count(); |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 133 | } |
134 | |||||
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 135 | table routing_v6 { |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 136 | key = { |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 137 | hdr.ipv6.dst_addr: lpm @name("ipv6_dst"); |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 138 | } |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 139 | actions = { |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 140 | set_next_id_routing_v6; |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 141 | @defaultonly nop; |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 142 | } |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 143 | const default_action = nop(); |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 144 | counters = routing_v6_counter; |
Carmelo Cascone | 70e816b | 2019-03-19 16:15:47 -0700 | [diff] [blame] | 145 | size = ROUTING_V6_TABLE_SIZE; |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 146 | } |
Yi Tseng | 47eac89 | 2018-07-11 02:17:04 +0800 | [diff] [blame] | 147 | #endif // WITH_IPV6 |
148 | |||||
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 149 | apply { |
Carmelo Cascone | b5324e7 | 2018-11-25 02:26:32 -0800 | [diff] [blame] | 150 | if (fabric_metadata.fwd_type == FWD_BRIDGING) bridging.apply(); |
151 | else if (fabric_metadata.fwd_type == FWD_MPLS) mpls.apply(); | ||||
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 152 | else if (fabric_metadata.fwd_type == FWD_IPV4_UNICAST) routing_v4.apply(); |
Carmelo Cascone | ed88f2b | 2018-01-26 17:36:34 -0800 | [diff] [blame] | 153 | #ifdef WITH_IPV6 |
Charles Chan | 384aea2 | 2018-08-23 22:08:02 -0700 | [diff] [blame] | 154 | else if (fabric_metadata.fwd_type == FWD_IPV6_UNICAST) routing_v6.apply(); |
Carmelo Cascone | ed88f2b | 2018-01-26 17:36:34 -0800 | [diff] [blame] | 155 | #endif // WITH_IPV6 |
Yi Tseng | be34205 | 2017-11-03 10:21:23 -0700 | [diff] [blame] | 156 | } |
157 | } |