]>
Commit | Line | Data |
---|---|---|
064af421 | 1 | /* |
0d085684 | 2 | * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. |
064af421 | 3 | * |
a14bc59f BP |
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: | |
064af421 | 7 | * |
a14bc59f BP |
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. | |
064af421 BP |
15 | */ |
16 | ||
17 | #ifndef RCONN_H | |
18 | #define RCONN_H 1 | |
19 | ||
064af421 BP |
20 | #include <stdbool.h> |
21 | #include <stdint.h> | |
22 | #include <time.h> | |
dbba996b | 23 | #include "openvswitch/types.h" |
064af421 BP |
24 | |
25 | /* A wrapper around vconn that provides queuing and optionally reliability. | |
26 | * | |
27 | * An rconn maintains a message transmission queue of bounded length specified | |
28 | * by the caller. The rconn does not guarantee reliable delivery of | |
29 | * queued messages: all queued messages are dropped when reconnection becomes | |
30 | * necessary. | |
31 | * | |
32 | * An rconn optionally provides reliable communication, in this sense: the | |
33 | * rconn will re-connect, with exponential backoff, when the underlying vconn | |
34 | * disconnects. | |
35 | */ | |
36 | ||
37 | struct vconn; | |
38 | struct rconn_packet_counter; | |
39 | ||
f125905c MM |
40 | struct rconn *rconn_create(int inactivity_probe_interval, |
41 | int max_backoff, uint8_t dscp); | |
42 | void rconn_set_dscp(struct rconn *rc, uint8_t dscp); | |
064af421 BP |
43 | void rconn_set_max_backoff(struct rconn *, int max_backoff); |
44 | int rconn_get_max_backoff(const struct rconn *); | |
45 | void rconn_set_probe_interval(struct rconn *, int inactivity_probe_interval); | |
46 | int rconn_get_probe_interval(const struct rconn *); | |
47 | ||
eb15cdbb BP |
48 | void rconn_connect(struct rconn *, const char *target, const char *name); |
49 | void rconn_connect_unreliably(struct rconn *, | |
50 | struct vconn *, const char *name); | |
064af421 BP |
51 | void rconn_reconnect(struct rconn *); |
52 | void rconn_disconnect(struct rconn *); | |
53 | void rconn_destroy(struct rconn *); | |
54 | ||
55 | void rconn_run(struct rconn *); | |
56 | void rconn_run_wait(struct rconn *); | |
57 | struct ofpbuf *rconn_recv(struct rconn *); | |
58 | void rconn_recv_wait(struct rconn *); | |
59 | int rconn_send(struct rconn *, struct ofpbuf *, struct rconn_packet_counter *); | |
60 | int rconn_send_with_limit(struct rconn *, struct ofpbuf *, | |
61 | struct rconn_packet_counter *, int queue_limit); | |
62 | unsigned int rconn_packets_sent(const struct rconn *); | |
63 | unsigned int rconn_packets_received(const struct rconn *); | |
64 | ||
65 | void rconn_add_monitor(struct rconn *, struct vconn *); | |
66 | ||
67 | const char *rconn_get_name(const struct rconn *); | |
eb15cdbb BP |
68 | void rconn_set_name(struct rconn *, const char *new_name); |
69 | const char *rconn_get_target(const struct rconn *); | |
70 | ||
064af421 BP |
71 | bool rconn_is_alive(const struct rconn *); |
72 | bool rconn_is_connected(const struct rconn *); | |
7778bd15 | 73 | bool rconn_is_admitted(const struct rconn *); |
064af421 | 74 | int rconn_failure_duration(const struct rconn *); |
064af421 | 75 | |
dbba996b BP |
76 | ovs_be32 rconn_get_remote_ip(const struct rconn *); |
77 | ovs_be16 rconn_get_remote_port(const struct rconn *); | |
78 | ovs_be32 rconn_get_local_ip(const struct rconn *); | |
79 | ovs_be16 rconn_get_local_port(const struct rconn *); | |
27527aa0 | 80 | int rconn_get_version(const struct rconn *); |
064af421 BP |
81 | |
82 | const char *rconn_get_state(const struct rconn *); | |
83 | unsigned int rconn_get_attempted_connections(const struct rconn *); | |
84 | unsigned int rconn_get_successful_connections(const struct rconn *); | |
85 | time_t rconn_get_last_connection(const struct rconn *); | |
2cdcb898 | 86 | time_t rconn_get_last_disconnect(const struct rconn *); |
7df824b7 | 87 | time_t rconn_get_last_received(const struct rconn *); |
064af421 BP |
88 | time_t rconn_get_creation_time(const struct rconn *); |
89 | unsigned long int rconn_get_total_time_connected(const struct rconn *); | |
90 | int rconn_get_backoff(const struct rconn *); | |
91 | unsigned int rconn_get_state_elapsed(const struct rconn *); | |
92 | unsigned int rconn_get_connection_seqno(const struct rconn *); | |
88a20d6e | 93 | int rconn_get_last_error(const struct rconn *); |
0d085684 | 94 | unsigned int rconn_count_txqlen(const struct rconn *); |
064af421 BP |
95 | |
96 | /* Counts the number of packets queued into an rconn by a given source. */ | |
97 | struct rconn_packet_counter { | |
98 | int n; /* Number of packets queued. */ | |
99 | int ref_cnt; /* Number of owners. */ | |
100 | }; | |
101 | ||
102 | struct rconn_packet_counter *rconn_packet_counter_create(void); | |
103 | void rconn_packet_counter_destroy(struct rconn_packet_counter *); | |
104 | void rconn_packet_counter_inc(struct rconn_packet_counter *); | |
105 | void rconn_packet_counter_dec(struct rconn_packet_counter *); | |
106 | ||
107 | static inline int | |
108 | rconn_packet_counter_read(const struct rconn_packet_counter *counter) | |
109 | { | |
110 | return counter->n; | |
111 | } | |
112 | ||
113 | #endif /* rconn.h */ |