Changes in uspace/srv/net/dnsrsrv/transport.c [26de91a:06fe3b6] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/dnsrsrv/transport.c
r26de91a r06fe3b6 52 52 53 53 /** Request timeout (microseconds) */ 54 #define REQ_TIMEOUT (5 * 1000 *1000)54 #define REQ_TIMEOUT (5*1000*1000) 55 55 56 56 /** Maximum number of retries */ 57 57 #define REQ_RETRY_MAX 3 58 59 inet_addr_t dns_server_addr;60 58 61 59 typedef struct { … … 74 72 static fid_t recv_fid; 75 73 static int transport_fd = -1; 74 inet_addr_t dns_server_addr; 76 75 77 76 /** Outstanding requests */ … … 158 157 assert(fibril_mutex_is_locked(&treq_lock)); 159 158 160 list_foreach(treq_list, lreq, trans_req_t, treq) { 159 list_foreach(treq_list, link) { 160 trans_req_t *treq = list_get_instance(link, trans_req_t, lreq); 161 161 162 if (treq->req->id == resp->id) { 162 163 /* Match */ … … 181 182 int dns_request(dns_message_t *req, dns_message_t **rresp) 182 183 { 183 trans_req_t *treq = NULL; 184 struct sockaddr *saddr = NULL; 185 socklen_t saddrlen; 186 184 int rc; 187 185 void *req_data; 188 186 size_t req_size; 189 int rc = dns_message_encode(req, &req_data, &req_size); 187 struct sockaddr_in addr; 188 trans_req_t *treq; 189 int ntry; 190 191 req_data = NULL; 192 treq = NULL; 193 194 addr.sin_family = AF_INET; 195 addr.sin_port = htons(DNS_SERVER_PORT); 196 addr.sin_addr.s_addr = host2uint32_t_be(dns_server_addr.ipv4); 197 198 rc = dns_message_encode(req, &req_data, &req_size); 190 199 if (rc != EOK) 191 200 goto error; 192 193 rc = inet_addr_sockaddr(&dns_server_addr, DNS_SERVER_PORT, 194 &saddr, &saddrlen); 195 if (rc != EOK) { 196 assert(rc == ENOMEM); 197 goto error; 198 } 199 200 size_t ntry = 0; 201 201 202 ntry = 0; 203 202 204 while (ntry < REQ_RETRY_MAX) { 203 205 rc = sendto(transport_fd, req_data, req_size, 0, 204 saddr, saddrlen);206 (struct sockaddr *)&addr, sizeof(addr)); 205 207 if (rc != EOK) 206 208 goto error; 207 209 208 210 treq = treq_create(req); 209 211 if (treq == NULL) { … … 211 213 goto error; 212 214 } 213 215 216 214 217 fibril_mutex_lock(&treq->done_lock); 215 218 while (treq->done != true) { … … 221 224 } 222 225 } 223 226 224 227 fibril_mutex_unlock(&treq->done_lock); 225 228 226 229 if (rc != ETIMEOUT) 227 230 break; 228 231 } 229 232 230 233 if (ntry >= REQ_RETRY_MAX) { 231 234 rc = EIO; 232 235 goto error; 233 236 } 234 237 235 238 if (treq->status != EOK) { 236 239 rc = treq->status; 237 240 goto error; 238 241 } 239 242 240 243 *rresp = treq->resp; 241 244 treq_destroy(treq); 242 245 free(req_data); 243 free(saddr);244 246 return EOK; 245 246 247 error: 247 248 if (treq != NULL) 248 249 treq_destroy(treq); 249 250 250 free(req_data); 251 free(saddr);252 251 return rc; 253 252 }
Note:
See TracChangeset
for help on using the changeset viewer.