From 1d807fc720bda7ec446c683bbc1a5e32897ca04e Mon Sep 17 00:00:00 2001 From: Stefano Brivio Date: Wed, 17 Mar 2021 10:57:44 +0100 Subject: passt: Introduce ICMP echo proxy It's nice to be able to confirm connectivity using ICMP or ICMPv6 echo requests, and "ping" sockets on Linux (IPPROTO_ICMP datagram) allow us to do that without any special capability. Signed-off-by: Stefano Brivio --- util.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'util.c') diff --git a/util.c b/util.c index e8ee57f..44357b7 100644 --- a/util.c +++ b/util.c @@ -160,7 +160,8 @@ int sock_l4_add(struct ctx *c, int v, uint16_t proto, uint16_t port) const struct sockaddr *sa; int fd, sl, one = 1; - if (proto != IPPROTO_TCP && proto != IPPROTO_UDP) + if (proto != IPPROTO_TCP && proto != IPPROTO_UDP && + proto != IPPROTO_ICMP && proto != IPPROTO_ICMPV6) return -1; /* Not implemented. */ fd = socket(v == 4 ? AF_INET : AF_INET6, @@ -170,6 +171,9 @@ int sock_l4_add(struct ctx *c, int v, uint16_t proto, uint16_t port) return -1; } + if (proto == IPPROTO_ICMP || proto == IPPROTO_ICMPV6) + goto epoll_add; + if (v == 4) { sa = (const struct sockaddr *)&addr4; sl = sizeof(addr4); @@ -195,6 +199,7 @@ int sock_l4_add(struct ctx *c, int v, uint16_t proto, uint16_t port) return -1; } +epoll_add: ev.events = EPOLLIN; ev.data.fd = fd; if (epoll_ctl(c->epollfd, EPOLL_CTL_ADD, fd, &ev) == -1) { -- cgit v1.2.3