]>
Commit | Line | Data |
---|---|---|
9583bc14 EJ |
1 | /* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. |
2 | * | |
3 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
4 | * you may not use this file except in compliance with the License. | |
5 | * You may obtain a copy of the License at: | |
6 | * | |
7 | * http://www.apache.org/licenses/LICENSE-2.0 | |
8 | * | |
9 | * Unless required by applicable law or agreed to in writing, software | |
10 | * distributed under the License is distributed on an "AS IS" BASIS, | |
11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 | * See the License for the specific language governing permissions and | |
13 | * limitations under the License. */ | |
14 | ||
15 | #ifndef OFPROT_DPIF_XLATE_H | |
16 | #define OFPROT_DPIF_XLATE_H 1 | |
17 | ||
18 | #include "flow.h" | |
19 | #include "meta-flow.h" | |
20 | #include "odp-util.h" | |
21 | #include "ofpbuf.h" | |
ec7ceaed | 22 | #include "ofproto-dpif-mirror.h" |
9583bc14 EJ |
23 | #include "ofproto-dpif.h" |
24 | #include "tag.h" | |
25 | ||
9583bc14 EJ |
26 | struct xlate_out { |
27 | /* Wildcards relevant in translation. Any fields that were used to | |
28 | * calculate the action must be set for caching and kernel | |
29 | * wildcarding to work. For example, if the flow lookup involved | |
30 | * performing the "normal" action on IPv4 and ARP packets, 'wc' | |
31 | * would have the 'in_port' (always set), 'dl_type' (flow match), | |
32 | * 'vlan_tci' (normal action), and 'dl_dst' (normal action) fields | |
33 | * set. */ | |
34 | struct flow_wildcards wc; | |
35 | ||
36 | tag_type tags; /* Tags associated with actions. */ | |
37 | enum slow_path_reason slow; /* 0 if fast path may be used. */ | |
38 | bool has_learn; /* Actions include NXAST_LEARN? */ | |
39 | bool has_normal; /* Actions output to OFPP_NORMAL? */ | |
40 | bool has_fin_timeout; /* Actions include NXAST_FIN_TIMEOUT? */ | |
4e022ec0 | 41 | ofp_port_t nf_output_iface; /* Output interface index for NetFlow. */ |
9583bc14 EJ |
42 | mirror_mask_t mirrors; /* Bitmap of associated mirrors. */ |
43 | ||
44 | uint64_t odp_actions_stub[256 / 8]; | |
45 | struct ofpbuf odp_actions; | |
46 | }; | |
47 | ||
48 | struct xlate_in { | |
49 | struct ofproto_dpif *ofproto; | |
50 | ||
51 | /* Flow to which the OpenFlow actions apply. xlate_actions() will modify | |
52 | * this flow when actions change header fields. */ | |
53 | struct flow flow; | |
54 | ||
55 | /* The packet corresponding to 'flow', or a null pointer if we are | |
56 | * revalidating without a packet to refer to. */ | |
57 | const struct ofpbuf *packet; | |
58 | ||
59 | /* Should OFPP_NORMAL update the MAC learning table? Should "learn" | |
60 | * actions update the flow table? | |
61 | * | |
62 | * We want to update these tables if we are actually processing a packet, | |
63 | * or if we are accounting for packets that the datapath has processed, but | |
64 | * not if we are just revalidating. */ | |
65 | bool may_learn; | |
66 | ||
67 | /* The rule initiating translation or NULL. */ | |
68 | struct rule_dpif *rule; | |
69 | ||
70 | /* The actions to translate. If 'rule' is not NULL, these may be NULL. */ | |
71 | const struct ofpact *ofpacts; | |
72 | size_t ofpacts_len; | |
73 | ||
74 | /* Union of the set of TCP flags seen so far in this flow. (Used only by | |
75 | * NXAST_FIN_TIMEOUT. Set to zero to avoid updating updating rules' | |
76 | * timeouts.) */ | |
77 | uint8_t tcp_flags; | |
78 | ||
79 | /* If nonnull, flow translation calls this function just before executing a | |
80 | * resubmit or OFPP_TABLE action. In addition, disables logging of traces | |
81 | * when the recursion depth is exceeded. | |
82 | * | |
83 | * 'rule' is the rule being submitted into. It will be null if the | |
84 | * resubmit or OFPP_TABLE action didn't find a matching rule. | |
85 | * | |
4d0acc70 EJ |
86 | * 'recurse' is the resubmit recursion depth at time of invocation. |
87 | * | |
9583bc14 EJ |
88 | * This is normally null so the client has to set it manually after |
89 | * calling xlate_in_init(). */ | |
4d0acc70 EJ |
90 | void (*resubmit_hook)(struct xlate_in *, struct rule_dpif *rule, |
91 | int recurse); | |
9583bc14 EJ |
92 | |
93 | /* If nonnull, flow translation calls this function to report some | |
94 | * significant decision, e.g. to explain why OFPP_NORMAL translation | |
4d0acc70 EJ |
95 | * dropped a packet. 'recurse' is the resubmit recursion depth at time of |
96 | * invocation. */ | |
97 | void (*report_hook)(struct xlate_in *, const char *s, int recurse); | |
9583bc14 EJ |
98 | |
99 | /* If nonnull, flow translation credits the specified statistics to each | |
100 | * rule reached through a resubmit or OFPP_TABLE action. | |
101 | * | |
102 | * This is normally null so the client has to set it manually after | |
103 | * calling xlate_in_init(). */ | |
104 | const struct dpif_flow_stats *resubmit_stats; | |
105 | }; | |
106 | ||
9583bc14 EJ |
107 | void xlate_actions(struct xlate_in *, struct xlate_out *); |
108 | void xlate_in_init(struct xlate_in *, struct ofproto_dpif *, | |
109 | const struct flow *, struct rule_dpif *, | |
110 | uint8_t tcp_flags, const struct ofpbuf *packet); | |
111 | void xlate_out_uninit(struct xlate_out *); | |
112 | void xlate_actions_for_side_effects(struct xlate_in *); | |
113 | void xlate_out_copy(struct xlate_out *dst, const struct xlate_out *src); | |
114 | ||
115 | #endif /* ofproto-dpif-xlate.h */ |