Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 1 | |
Igor Sysoev | 87a01ea | 2003-10-02 05:39:37 +0000 | [diff] [blame] | 2 | #include <ngx_config.h> |
| 3 | #include <ngx_core.h> |
| 4 | #include <ngx_event.h> |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 5 | #include <ngx_event_connect.h> |
| 6 | |
Igor Sysoev | ae5c59c | 2003-08-14 06:00:28 +0000 | [diff] [blame] | 7 | |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 8 | /* AF_INET only */ |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 9 | |
Igor Sysoev | 0441050 | 2003-08-01 14:56:33 +0000 | [diff] [blame] | 10 | int ngx_event_connect_peer(ngx_peer_connection_t *pc) |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 11 | { |
Igor Sysoev | d9d0ca1 | 2003-11-21 06:30:49 +0000 | [diff] [blame] | 12 | int rc, instance; |
| 13 | u_int event; |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 14 | time_t now; |
Igor Sysoev | 87a01ea | 2003-10-02 05:39:37 +0000 | [diff] [blame] | 15 | ngx_err_t err; |
| 16 | ngx_peer_t *peer; |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 17 | ngx_socket_t s; |
Igor Sysoev | 87a01ea | 2003-10-02 05:39:37 +0000 | [diff] [blame] | 18 | ngx_event_t *rev, *wev; |
| 19 | ngx_connection_t *c; |
| 20 | struct sockaddr_in addr; |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 21 | |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 22 | now = ngx_time(); |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 23 | |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 24 | /* ngx_lock_mutex(pc->peers->mutex); */ |
| 25 | |
| 26 | if (pc->peers->last_cached) { |
| 27 | |
| 28 | /* cached connection */ |
| 29 | |
Igor Sysoev | ae5c59c | 2003-08-14 06:00:28 +0000 | [diff] [blame] | 30 | pc->connection = pc->peers->cached[pc->peers->last_cached]; |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 31 | pc->peers->last_cached--; |
| 32 | |
| 33 | /* ngx_unlock_mutex(pc->peers->mutex); */ |
| 34 | |
| 35 | pc->cached = 1; |
| 36 | return NGX_OK; |
| 37 | } |
| 38 | |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 39 | pc->cached = 0; |
Igor Sysoev | 0441050 | 2003-08-01 14:56:33 +0000 | [diff] [blame] | 40 | pc->connection = NULL; |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 41 | |
Igor Sysoev | 219d44d | 2003-10-31 07:10:36 +0000 | [diff] [blame] | 42 | if (pc->peers->number == 1) { |
| 43 | peer = &pc->peers->peers[0]; |
| 44 | |
| 45 | } else { |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 46 | |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 47 | /* there are several peers */ |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 48 | |
Igor Sysoev | 5b8d388 | 2003-07-21 16:24:25 +0000 | [diff] [blame] | 49 | if (pc->tries == pc->peers->number) { |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 50 | |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 51 | /* it's a first try - get a current peer */ |
| 52 | |
Igor Sysoev | 5b8d388 | 2003-07-21 16:24:25 +0000 | [diff] [blame] | 53 | pc->cur_peer = pc->peers->current++; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 54 | |
Igor Sysoev | 87a01ea | 2003-10-02 05:39:37 +0000 | [diff] [blame] | 55 | if (pc->peers->current >= pc->peers->number) { |
Igor Sysoev | 5b8d388 | 2003-07-21 16:24:25 +0000 | [diff] [blame] | 56 | pc->peers->current = 0; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 57 | } |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 58 | } |
| 59 | |
Igor Sysoev | 219d44d | 2003-10-31 07:10:36 +0000 | [diff] [blame] | 60 | if (pc->peers->max_fails == 0) { |
| 61 | peer = &pc->peers->peers[pc->cur_peer]; |
| 62 | |
| 63 | } else { |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 64 | |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 65 | /* the peers support a fault tolerance */ |
| 66 | |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 67 | for ( ;; ) { |
Igor Sysoev | 5b8d388 | 2003-07-21 16:24:25 +0000 | [diff] [blame] | 68 | peer = &pc->peers->peers[pc->cur_peer]; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 69 | |
Igor Sysoev | 5b8d388 | 2003-07-21 16:24:25 +0000 | [diff] [blame] | 70 | if (peer->fails <= pc->peers->max_fails |
| 71 | || (now - peer->accessed > pc->peers->fail_timeout)) |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 72 | { |
| 73 | break; |
| 74 | } |
| 75 | |
Igor Sysoev | 5b8d388 | 2003-07-21 16:24:25 +0000 | [diff] [blame] | 76 | pc->cur_peer++; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 77 | |
Igor Sysoev | 5b8d388 | 2003-07-21 16:24:25 +0000 | [diff] [blame] | 78 | if (pc->cur_peer >= pc->peers->number) { |
| 79 | pc->cur_peer = 0; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 80 | } |
| 81 | |
Igor Sysoev | 5b8d388 | 2003-07-21 16:24:25 +0000 | [diff] [blame] | 82 | pc->tries--; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 83 | |
Igor Sysoev | 5b8d388 | 2003-07-21 16:24:25 +0000 | [diff] [blame] | 84 | if (pc->tries == 0) { |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 85 | /* ngx_unlock_mutex(pc->peers->mutex); */ |
Igor Sysoev | 87a01ea | 2003-10-02 05:39:37 +0000 | [diff] [blame] | 86 | |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 87 | return NGX_ERROR; |
| 88 | } |
| 89 | } |
| 90 | } |
| 91 | } |
| 92 | |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 93 | /* ngx_unlock_mutex(pc->peers->mutex); */ |
| 94 | |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 95 | |
| 96 | s = ngx_socket(AF_INET, SOCK_STREAM, IPPROTO_IP, 0); |
| 97 | |
| 98 | if (s == -1) { |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 99 | ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 100 | ngx_socket_n " failed"); |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 101 | return NGX_ERROR; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 102 | } |
| 103 | |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 104 | if (pc->rcvbuf) { |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 105 | if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 106 | (const void *) &pc->rcvbuf, sizeof(int)) == -1) { |
| 107 | ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 108 | "setsockopt(SO_RCVBUF) failed"); |
| 109 | |
| 110 | if (ngx_close_socket(s) == -1) { |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 111 | ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 112 | ngx_close_socket_n " failed"); |
| 113 | } |
| 114 | |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 115 | return NGX_ERROR; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 116 | } |
| 117 | } |
| 118 | |
| 119 | if (ngx_nonblocking(s) == -1) { |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 120 | ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 121 | ngx_nonblocking_n " failed"); |
| 122 | |
| 123 | if (ngx_close_socket(s) == -1) { |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 124 | ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 125 | ngx_close_socket_n " failed"); |
| 126 | } |
| 127 | |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 128 | return NGX_ERROR; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 129 | } |
| 130 | |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 131 | #if (WIN32) |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 132 | /* |
| 133 | * Winsock assignes a socket number divisible by 4 |
| 134 | * so to find a connection we divide a socket number by 4. |
| 135 | */ |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 136 | |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 137 | if (s % 4) { |
| 138 | ngx_log_error(NGX_LOG_EMERG, pc->log, 0, |
| 139 | ngx_socket_n |
| 140 | " created socket %d, not divisible by 4", s); |
| 141 | exit(1); |
| 142 | } |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 143 | |
| 144 | c = &ngx_cycle->connections[s / 4]; |
| 145 | rev = &ngx_cycle->read_events[s / 4]; |
| 146 | wev = &ngx_cycle->write_events[s / 4]; |
| 147 | |
| 148 | #else |
| 149 | |
| 150 | c = &ngx_cycle->connections[s]; |
| 151 | rev = &ngx_cycle->read_events[s]; |
| 152 | wev = &ngx_cycle->write_events[s]; |
| 153 | |
| 154 | #endif |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 155 | |
| 156 | instance = rev->instance; |
| 157 | |
| 158 | ngx_memzero(c, sizeof(ngx_connection_t)); |
| 159 | ngx_memzero(rev, sizeof(ngx_event_t)); |
| 160 | ngx_memzero(wev, sizeof(ngx_event_t)); |
| 161 | |
Igor Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 162 | rev->index = NGX_INVALID_INDEX; |
| 163 | wev->index = NGX_INVALID_INDEX; |
| 164 | |
| 165 | rev->data = c; |
| 166 | wev->data = c; |
| 167 | |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 168 | c->read = rev; |
| 169 | c->write = wev; |
Igor Sysoev | fd3e374 | 2003-10-08 04:34:07 +0000 | [diff] [blame] | 170 | wev->write = 1; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 171 | |
Igor Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 172 | rev->instance = !instance; |
| 173 | wev->instance = !instance; |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 174 | |
Igor Sysoev | 160d774 | 2003-11-19 16:26:41 +0000 | [diff] [blame] | 175 | c->log = pc->log; |
| 176 | rev->log = pc->log; |
| 177 | wev->log = pc->log; |
| 178 | |
Igor Sysoev | 6b863e3 | 2003-05-12 15:52:24 +0000 | [diff] [blame] | 179 | c->fd = s; |
Igor Sysoev | 72f2e36 | 2003-07-22 19:53:10 +0000 | [diff] [blame] | 180 | |
| 181 | pc->connection = c; |
| 182 | |
| 183 | if (ngx_add_conn) { |
| 184 | if (ngx_add_conn(c) == NGX_ERROR) { |
| 185 | return NGX_ERROR; |
| 186 | } |
| 187 | } |
| 188 | |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 189 | ngx_memzero(&addr, sizeof(struct sockaddr_in)); |
| 190 | |
Igor Sysoev | 87a01ea | 2003-10-02 05:39:37 +0000 | [diff] [blame] | 191 | addr.sin_family = AF_INET; |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 192 | addr.sin_port = peer->port; |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 193 | addr.sin_addr.s_addr = peer->addr; |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 194 | |
Igor Sysoev | 425a42c | 2003-10-27 16:16:17 +0000 | [diff] [blame] | 195 | ngx_log_debug(pc->log, "CONNECT: %s" _ peer->addr_port_text.data); |
| 196 | |
Igor Sysoev | 87a01ea | 2003-10-02 05:39:37 +0000 | [diff] [blame] | 197 | rc = connect(s, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)); |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 198 | |
| 199 | if (rc == -1) { |
| 200 | err = ngx_socket_errno; |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 201 | |
| 202 | /* Winsock returns WSAEWOULDBLOCK */ |
| 203 | |
| 204 | if (err != NGX_EINPROGRESS && err != NGX_EAGAIN) { |
Igor Sysoev | 2b0c76c | 2003-10-27 21:01:00 +0000 | [diff] [blame] | 205 | ngx_log_error(NGX_LOG_ERR, pc->log, err, "connect() failed"); |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 206 | |
| 207 | if (ngx_close_socket(s) == -1) { |
| 208 | ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
| 209 | ngx_close_socket_n " failed"); |
| 210 | } |
| 211 | |
Igor Sysoev | 931a400 | 2003-10-07 15:30:05 +0000 | [diff] [blame] | 212 | c->fd = -1; |
| 213 | |
Igor Sysoev | 3a08118 | 2003-07-23 13:10:12 +0000 | [diff] [blame] | 214 | return NGX_CONNECT_ERROR; |
| 215 | } |
| 216 | } |
| 217 | |
Igor Sysoev | b5faed2 | 2003-10-29 08:30:44 +0000 | [diff] [blame] | 218 | if (ngx_event_flags & NGX_USE_AIO_EVENT) { |
Igor Sysoev | b5faed2 | 2003-10-29 08:30:44 +0000 | [diff] [blame] | 219 | |
Igor Sysoev | b5910d4 | 2003-10-30 16:51:33 +0000 | [diff] [blame] | 220 | /* aio, iocp */ |
| 221 | |
| 222 | if (ngx_blocking(s) == -1) { |
| 223 | ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
| 224 | ngx_blocking_n " failed"); |
| 225 | |
| 226 | if (ngx_close_socket(s) == -1) { |
| 227 | ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno, |
| 228 | ngx_close_socket_n " failed"); |
| 229 | } |
| 230 | |
| 231 | return NGX_ERROR; |
| 232 | } |
| 233 | |
| 234 | /* |
| 235 | * aio allows to post operation on non-connected socket |
Igor Sysoev | f2e676a | 2003-11-16 21:49:42 +0000 | [diff] [blame] | 236 | * at least in FreeBSD. |
| 237 | * NT does not support it. |
Igor Sysoev | b5910d4 | 2003-10-30 16:51:33 +0000 | [diff] [blame] | 238 | * |
Igor Sysoev | fe0f5cc | 2003-10-31 16:05:33 +0000 | [diff] [blame] | 239 | * TODO: check in Win32, etc. As workaround we can use NGX_ONESHOT_EVENT |
Igor Sysoev | b5910d4 | 2003-10-30 16:51:33 +0000 | [diff] [blame] | 240 | */ |
| 241 | |
Igor Sysoev | 68ee8f1 | 2003-10-30 08:51:06 +0000 | [diff] [blame] | 242 | rev->ready = 1; |
Igor Sysoev | b5faed2 | 2003-10-29 08:30:44 +0000 | [diff] [blame] | 243 | wev->ready = 1; |
Igor Sysoev | 68ee8f1 | 2003-10-30 08:51:06 +0000 | [diff] [blame] | 244 | |
Igor Sysoev | b5faed2 | 2003-10-29 08:30:44 +0000 | [diff] [blame] | 245 | return NGX_OK; |
Igor Sysoev | b5faed2 | 2003-10-29 08:30:44 +0000 | [diff] [blame] | 246 | } |
| 247 | |
| 248 | /* TODO: epoll */ |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 249 | |
Igor Sysoev | 0a280a3 | 2003-10-12 16:49:16 +0000 | [diff] [blame] | 250 | if (ngx_event_flags & NGX_USE_CLEAR_EVENT) { /* kqueue */ |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 251 | event = NGX_CLEAR_EVENT; |
| 252 | |
| 253 | } else { /* select, poll, /dev/poll */ |
| 254 | event = NGX_LEVEL_EVENT; |
| 255 | } |
| 256 | |
Igor Sysoev | 2b0c76c | 2003-10-27 21:01:00 +0000 | [diff] [blame] | 257 | if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { |
| 258 | return NGX_ERROR; |
| 259 | } |
| 260 | |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 261 | if (rc == -1) { |
| 262 | |
| 263 | /* NGX_EINPROGRESS */ |
| 264 | |
| 265 | if (ngx_add_event(wev, NGX_WRITE_EVENT, event) != NGX_OK) { |
| 266 | return NGX_ERROR; |
| 267 | } |
| 268 | |
| 269 | return NGX_AGAIN; |
| 270 | } |
| 271 | |
Igor Sysoev | 222a2ad | 2003-11-18 16:49:00 +0000 | [diff] [blame] | 272 | ngx_log_debug(pc->log, "CONNECTED"); |
| 273 | |
Igor Sysoev | d404c97 | 2003-10-16 20:19:16 +0000 | [diff] [blame] | 274 | wev->ready = 1; |
| 275 | |
Igor Sysoev | 87a01ea | 2003-10-02 05:39:37 +0000 | [diff] [blame] | 276 | return NGX_OK; |
Igor Sysoev | 890fc96 | 2003-07-20 21:15:59 +0000 | [diff] [blame] | 277 | } |
Igor Sysoev | ae5c59c | 2003-08-14 06:00:28 +0000 | [diff] [blame] | 278 | |
| 279 | |
| 280 | void ngx_event_connect_peer_failed(ngx_peer_connection_t *pc) |
| 281 | { |
Igor Sysoev | 219d44d | 2003-10-31 07:10:36 +0000 | [diff] [blame] | 282 | time_t now; |
| 283 | |
| 284 | now = ngx_time(); |
| 285 | |
| 286 | /* ngx_lock_mutex(pc->peers->mutex); */ |
| 287 | |
| 288 | pc->peers->peers[pc->cur_peer].fails++; |
| 289 | pc->peers->peers[pc->cur_peer].accessed = now; |
| 290 | |
| 291 | /* ngx_unlock_mutex(pc->peers->mutex); */ |
| 292 | |
Igor Sysoev | 425a42c | 2003-10-27 16:16:17 +0000 | [diff] [blame] | 293 | pc->cur_peer++; |
| 294 | |
| 295 | if (pc->cur_peer >= pc->peers->number) { |
| 296 | pc->cur_peer = 0; |
| 297 | } |
| 298 | |
Igor Sysoev | e677922 | 2003-10-03 15:50:53 +0000 | [diff] [blame] | 299 | pc->tries--; |
| 300 | |
Igor Sysoev | ae5c59c | 2003-08-14 06:00:28 +0000 | [diff] [blame] | 301 | return; |
| 302 | } |