*/
static int quic_bind_listener(struct listener *listener, char *errmsg, int errlen)
{
- int err = ERR_NONE;
+ const struct sockaddr_storage addr = listener->rx.addr;
+ int fd, err = ERR_NONE;
char *msg = NULL;
/* ensure we never return garbage */
goto udp_return;
}
+ /* Set IP_PKTINFO to retrieve destination address on recv. */
+ fd = listener->rx.fd;
+ switch (addr.ss_family) {
+ case AF_INET:
+#if defined(IP_PKTINFO)
+ setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
+#elif defined(IP_RECVDSTADDR)
+ setsockopt(fd, IPPROTO_IP, IP_RECVDSTADDR, &one, sizeof(one));
+#endif /* IP_PKTINFO || IP_RECVDSTADDR */
+ break;
+ case AF_INET6:
+#ifdef IPV6_RECVPKTINFO
+ setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
+#endif
+ break;
+ default:
+ break;
+ }
+
if (!quic_alloc_rxbufs_listener(listener)) {
msg = "could not initialize tx/rx rings";
err |= ERR_WARN;
}
#endif
-#ifdef USE_QUIC
- if (rx->proto->proto_type == PROTO_TYPE_DGRAM) {
- switch (addr_inet.ss_family) {
- case AF_INET:
-#if defined(IP_PKTINFO)
- setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &one, sizeof(one));
-#elif defined(IP_RECVDSTADDR)
- setsockopt(fd, IPPROTO_IP, IP_RECVDSTADDR, &one, sizeof(one));
-#endif /* IP_PKTINFO || IP_RECVDSTADDR */
- break;
- case AF_INET6:
-#ifdef IPV6_RECVPKTINFO
- setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
-#endif
- break;
- }
- }
-#endif /* USE_QUIC */
-
if (!ext && bind(fd, (struct sockaddr *)&addr_inet, rx->proto->fam->sock_addrlen) == -1) {
err |= ERR_RETRYABLE | ERR_ALERT;
memprintf(errmsg, "cannot bind socket (%s)", strerror(errno));