]>
Commit | Line | Data |
---|---|---|
19a87e36 | 1 | /* |
a930d4c5 | 2 | * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc. |
19a87e36 BP |
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 | #ifndef CONNMGR_H | |
18 | #define CONNMGR_H 1 | |
19 | ||
2b07c8b1 | 20 | #include "classifier.h" |
ee89ea7b | 21 | #include "openvswitch/hmap.h" |
b19bab5b | 22 | #include "openvswitch/list.h" |
e29747e4 | 23 | #include "openvswitch/match.h" |
f4248336 | 24 | #include "openvswitch/ofp-util.h" |
19a87e36 | 25 | #include "ofproto.h" |
cdbdeeda | 26 | #include "ofproto-provider.h" |
19a87e36 | 27 | #include "openflow/nicira-ext.h" |
e03c096d | 28 | #include "openvswitch/ofp-errors.h" |
19a87e36 BP |
29 | #include "openvswitch/types.h" |
30 | ||
a946b636 | 31 | struct nlattr; |
19a87e36 | 32 | struct ofconn; |
2b07c8b1 | 33 | struct rule; |
0d085684 | 34 | struct simap; |
81e2083f | 35 | struct sset; |
19a87e36 BP |
36 | |
37 | /* ofproto supports two kinds of OpenFlow connections: | |
38 | * | |
39 | * - "Primary" connections to ordinary OpenFlow controllers. ofproto | |
40 | * maintains persistent connections to these controllers and by default | |
41 | * sends them asynchronous messages such as packet-ins. | |
42 | * | |
43 | * - "Service" connections, e.g. from ovs-ofctl. When these connections | |
44 | * drop, it is the other side's responsibility to reconnect them if | |
45 | * necessary. ofproto does not send them asynchronous messages by default. | |
46 | * | |
47 | * Currently, active (tcp, ssl, unix) connections are always "primary" | |
48 | * connections and passive (ptcp, pssl, punix) connections are always "service" | |
49 | * connections. There is no inherent reason for this, but it reflects the | |
50 | * common case. | |
51 | */ | |
52 | enum ofconn_type { | |
53 | OFCONN_PRIMARY, /* An ordinary OpenFlow controller. */ | |
54 | OFCONN_SERVICE /* A service connection, e.g. "ovs-ofctl". */ | |
55 | }; | |
56 | ||
a2b53dec BP |
57 | /* An asynchronous message that might need to be queued between threads. */ |
58 | struct ofproto_async_msg { | |
ca6ba700 | 59 | struct ovs_list list_node; /* For queuing. */ |
f11c7538 | 60 | uint16_t controller_id; /* Controller ID to send to. */ |
a2b53dec BP |
61 | |
62 | enum ofputil_async_msg_type oam; | |
e8fed7d0 WT |
63 | /* OAM_PACKET_IN. */ |
64 | struct { | |
65 | struct ofputil_packet_in_private up; | |
66 | int max_len; /* From action, or -1 if none. */ | |
67 | } pin; | |
0fb7792a | 68 | }; |
a2b53dec | 69 | void ofproto_async_msg_free(struct ofproto_async_msg *); |
0fb7792a | 70 | |
19a87e36 BP |
71 | /* Basics. */ |
72 | struct connmgr *connmgr_create(struct ofproto *ofproto, | |
73 | const char *dpif_name, const char *local_name); | |
25010c68 JR |
74 | void connmgr_destroy(struct connmgr *) |
75 | OVS_REQUIRES(ofproto_mutex); | |
19a87e36 BP |
76 | |
77 | void connmgr_run(struct connmgr *, | |
b20f4073 | 78 | void (*handle_openflow)(struct ofconn *, |
e03248b7 | 79 | const struct ofpbuf *ofp_msg)); |
b20f4073 | 80 | void connmgr_wait(struct connmgr *); |
19a87e36 | 81 | |
0d085684 BP |
82 | void connmgr_get_memory_usage(const struct connmgr *, struct simap *usage); |
83 | ||
19a87e36 BP |
84 | struct ofproto *ofconn_get_ofproto(const struct ofconn *); |
85 | ||
7ee20df1 BP |
86 | void connmgr_retry(struct connmgr *); |
87 | ||
19a87e36 BP |
88 | /* OpenFlow configuration. */ |
89 | bool connmgr_has_controllers(const struct connmgr *); | |
90 | void connmgr_get_controller_info(struct connmgr *, struct shash *); | |
72ba2ed3 | 91 | void connmgr_free_controller_info(struct shash *); |
19a87e36 | 92 | void connmgr_set_controllers(struct connmgr *, |
1d9ffc17 SH |
93 | const struct ofproto_controller[], size_t n, |
94 | uint32_t allowed_versions); | |
19a87e36 BP |
95 | void connmgr_reconnect(const struct connmgr *); |
96 | ||
81e2083f BP |
97 | int connmgr_set_snoops(struct connmgr *, const struct sset *snoops); |
98 | bool connmgr_has_snoops(const struct connmgr *); | |
99 | void connmgr_get_snoops(const struct connmgr *, struct sset *snoops); | |
19a87e36 BP |
100 | |
101 | /* Individual connections to OpenFlow controllers. */ | |
102 | enum ofconn_type ofconn_get_type(const struct ofconn *); | |
103 | ||
f4f1ea7e | 104 | bool ofconn_get_master_election_id(const struct ofconn *, uint64_t *idp); |
6ea4776b | 105 | bool ofconn_set_master_election_id(struct ofconn *, uint64_t); |
f4f1ea7e BP |
106 | enum ofp12_controller_role ofconn_get_role(const struct ofconn *); |
107 | void ofconn_set_role(struct ofconn *, enum ofp12_controller_role); | |
19a87e36 | 108 | |
e3d560db | 109 | enum ofputil_protocol ofconn_get_protocol(const struct ofconn *); |
27527aa0 | 110 | void ofconn_set_protocol(struct ofconn *, enum ofputil_protocol); |
19a87e36 | 111 | |
54834960 EJ |
112 | enum nx_packet_in_format ofconn_get_packet_in_format(struct ofconn *); |
113 | void ofconn_set_packet_in_format(struct ofconn *, enum nx_packet_in_format); | |
114 | ||
a7349929 BP |
115 | void ofconn_set_controller_id(struct ofconn *, uint16_t controller_id); |
116 | ||
f0fd1a17 PS |
117 | void ofconn_set_invalid_ttl_to_controller(struct ofconn *, bool); |
118 | bool ofconn_get_invalid_ttl_to_controller(struct ofconn *); | |
119 | ||
19a87e36 BP |
120 | int ofconn_get_miss_send_len(const struct ofconn *); |
121 | void ofconn_set_miss_send_len(struct ofconn *, int miss_send_len); | |
122 | ||
80d5aefd | 123 | void ofconn_set_async_config(struct ofconn *, |
a930d4c5 BP |
124 | const struct ofputil_async_cfg *); |
125 | struct ofputil_async_cfg ofconn_get_async_config(const struct ofconn *); | |
80d5aefd | 126 | |
19a87e36 | 127 | void ofconn_send_reply(const struct ofconn *, struct ofpbuf *); |
ca6ba700 | 128 | void ofconn_send_replies(const struct ofconn *, struct ovs_list *); |
1be5ff75 | 129 | void ofconn_send_error(const struct ofconn *, const struct ofp_header *request, |
90bf1e07 | 130 | enum ofperr); |
19a87e36 | 131 | |
ff09bc08 JR |
132 | struct ofp_bundle; |
133 | ||
134 | struct ofp_bundle *ofconn_get_bundle(struct ofconn *, uint32_t id); | |
135 | enum ofperr ofconn_insert_bundle(struct ofconn *, struct ofp_bundle *); | |
136 | enum ofperr ofconn_remove_bundle(struct ofconn *, struct ofp_bundle *); | |
777af88d | 137 | |
696d1bcf BP |
138 | /* Logging flow_mod summaries. */ |
139 | void ofconn_report_flow_mod(struct ofconn *, enum ofp_flow_mod_command); | |
140 | ||
19a87e36 | 141 | /* Sending asynchronous messages. */ |
6b83a3c5 | 142 | bool connmgr_wants_packet_in_on_miss(struct connmgr *mgr); |
2a6f78e0 | 143 | void connmgr_send_port_status(struct connmgr *, struct ofconn *source, |
9e1fd49b | 144 | const struct ofputil_phy_port *, uint8_t reason); |
19a87e36 | 145 | void connmgr_send_flow_removed(struct connmgr *, |
25010c68 JR |
146 | const struct ofputil_flow_removed *) |
147 | OVS_REQUIRES(ofproto_mutex); | |
a2b53dec BP |
148 | void connmgr_send_async_msg(struct connmgr *, |
149 | const struct ofproto_async_msg *); | |
00467f73 AC |
150 | void ofconn_send_role_status(struct ofconn *ofconn, uint32_t role, |
151 | uint8_t reason); | |
19a87e36 | 152 | |
3c35db62 NR |
153 | void connmgr_send_requestforward(struct connmgr *, const struct ofconn *source, |
154 | const struct ofputil_requestforward *); | |
155 | ||
19a87e36 BP |
156 | /* Fail-open settings. */ |
157 | enum ofproto_fail_mode connmgr_get_fail_mode(const struct connmgr *); | |
158 | void connmgr_set_fail_mode(struct connmgr *, enum ofproto_fail_mode); | |
159 | ||
160 | /* Fail-open implementation. */ | |
161 | int connmgr_get_max_probe_interval(const struct connmgr *); | |
162 | bool connmgr_is_any_controller_connected(const struct connmgr *); | |
163 | bool connmgr_is_any_controller_admitted(const struct connmgr *); | |
164 | int connmgr_failure_duration(const struct connmgr *); | |
19a87e36 BP |
165 | |
166 | /* In-band configuration. */ | |
167 | void connmgr_set_extra_in_band_remotes(struct connmgr *, | |
168 | const struct sockaddr_in *, size_t); | |
169 | void connmgr_set_in_band_queue(struct connmgr *, int queue_id); | |
170 | ||
171 | /* In-band implementation. */ | |
f7f1ea29 | 172 | bool connmgr_has_in_band(struct connmgr *); |
19a87e36 BP |
173 | |
174 | /* Fail-open and in-band implementation. */ | |
175 | void connmgr_flushed(struct connmgr *); | |
176 | ||
3fbbcba7 BP |
177 | int connmgr_count_hidden_rules(const struct connmgr *); |
178 | ||
2b07c8b1 BP |
179 | /* A flow monitor managed by NXST_FLOW_MONITOR and related requests. */ |
180 | struct ofmonitor { | |
181 | struct ofconn *ofconn; /* Owning 'ofconn'. */ | |
182 | struct hmap_node ofconn_node; /* In ofconn's 'monitors' hmap. */ | |
183 | uint32_t id; | |
184 | ||
185 | enum nx_flow_monitor_flags flags; | |
186 | ||
187 | /* Matching. */ | |
4e022ec0 | 188 | ofp_port_t out_port; |
2b07c8b1 | 189 | uint8_t table_id; |
5cb7a798 | 190 | struct minimatch match; |
2b07c8b1 BP |
191 | }; |
192 | ||
193 | struct ofputil_flow_monitor_request; | |
194 | ||
195 | enum ofperr ofmonitor_create(const struct ofputil_flow_monitor_request *, | |
4cd1bc9d BP |
196 | struct ofconn *, struct ofmonitor **) |
197 | OVS_REQUIRES(ofproto_mutex); | |
198 | struct ofmonitor *ofmonitor_lookup(struct ofconn *, uint32_t id) | |
199 | OVS_REQUIRES(ofproto_mutex); | |
200 | void ofmonitor_destroy(struct ofmonitor *) | |
201 | OVS_REQUIRES(ofproto_mutex); | |
2b07c8b1 BP |
202 | |
203 | void ofmonitor_report(struct connmgr *, struct rule *, | |
204 | enum nx_flow_update_event, enum ofp_flow_removed_reason, | |
cdbdeeda SH |
205 | const struct ofconn *abbrev_ofconn, ovs_be32 abbrev_xid, |
206 | const struct rule_actions *old_actions) | |
15aaf599 | 207 | OVS_REQUIRES(ofproto_mutex); |
4cd1bc9d | 208 | void ofmonitor_flush(struct connmgr *) OVS_REQUIRES(ofproto_mutex); |
2b07c8b1 | 209 | |
a8e547c1 BP |
210 | |
211 | struct rule_collection; | |
2b07c8b1 | 212 | void ofmonitor_collect_resume_rules(struct ofmonitor *, uint64_t seqno, |
4cd1bc9d BP |
213 | struct rule_collection *) |
214 | OVS_REQUIRES(ofproto_mutex); | |
a8e547c1 | 215 | void ofmonitor_compose_refresh_updates(struct rule_collection *rules, |
ca6ba700 | 216 | struct ovs_list *msgs) |
4cd1bc9d | 217 | OVS_REQUIRES(ofproto_mutex); |
2b07c8b1 | 218 | |
6c6eedc5 SJ |
219 | void connmgr_send_table_status(struct connmgr *, |
220 | const struct ofputil_table_desc *td, | |
221 | uint8_t reason); | |
19a87e36 | 222 | #endif /* connmgr.h */ |