comparison src/lib/net.c @ 16822:6a814345f16c

lib: Added net_listen_full() with a flag to set SO_REUSEPORT on the socket if available.
author Timo Sirainen <tss@iki.fi>
date Mon, 23 Sep 2013 04:06:08 +0300
parents 07cc79e0041d
children 93cf0434dda4
comparison
equal deleted inserted replaced
16821:1a5d92b8d3d5 16822:6a814345f16c
382 #endif 382 #endif
383 } 383 }
384 384
385 int net_listen(const struct ip_addr *my_ip, unsigned int *port, int backlog) 385 int net_listen(const struct ip_addr *my_ip, unsigned int *port, int backlog)
386 { 386 {
387 enum net_listen_flags flags = 0;
388
389 return net_listen_full(my_ip, port, &flags, backlog);
390 }
391
392 int net_listen_full(const struct ip_addr *my_ip, unsigned int *port,
393 enum net_listen_flags *flags, int backlog)
394 {
387 union sockaddr_union so; 395 union sockaddr_union so;
388 int ret, fd, opt = 1; 396 int ret, fd, opt = 1;
389 socklen_t len; 397 socklen_t len;
390 398
391 memset(&so, 0, sizeof(so)); 399 memset(&so, 0, sizeof(so));
410 } 418 }
411 419
412 /* set socket options */ 420 /* set socket options */
413 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); 421 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
414 setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)); 422 setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt));
423
424 if ((*flags & NET_LISTEN_FLAG_REUSEPORT) != 0) {
425 #ifdef SO_REUSEPORT
426 if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT,
427 &opt, sizeof(opt)) < 0)
428 #endif
429 *flags &= ~NET_LISTEN_FLAG_REUSEPORT;
430 }
415 431
416 /* If using IPv6, bind only to IPv6 if possible. This avoids 432 /* If using IPv6, bind only to IPv6 if possible. This avoids
417 ambiguities with IPv4-mapped IPv6 addresses. */ 433 ambiguities with IPv4-mapped IPv6 addresses. */
418 #ifdef IPV6_V6ONLY 434 #ifdef IPV6_V6ONLY
419 if (so.sin.sin_family == AF_INET6) { 435 if (so.sin.sin_family == AF_INET6) {