summaryrefslogtreecommitdiffstats
path: root/lib/sockopt.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 09:53:30 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 09:53:30 +0000
commit2c7cac91ed6e7db0f6937923d2b57f97dbdbc337 (patch)
treec05dc0f8e6aa3accc84e3e5cffc933ed94941383 /lib/sockopt.h
parentInitial commit. (diff)
downloadfrr-2c7cac91ed6e7db0f6937923d2b57f97dbdbc337.tar.xz
frr-2c7cac91ed6e7db0f6937923d2b57f97dbdbc337.zip
Adding upstream version 8.4.4.upstream/8.4.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lib/sockopt.h')
-rw-r--r--lib/sockopt.h160
1 files changed, 160 insertions, 0 deletions
diff --git a/lib/sockopt.h b/lib/sockopt.h
new file mode 100644
index 0000000..6c80841
--- /dev/null
+++ b/lib/sockopt.h
@@ -0,0 +1,160 @@
+/* Router advertisement
+ * Copyright (C) 1999 Kunihiro Ishiguro
+ *
+ * This file is part of GNU Zebra.
+ *
+ * GNU Zebra is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * GNU Zebra is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _ZEBRA_SOCKOPT_H
+#define _ZEBRA_SOCKOPT_H
+
+#include "sockunion.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern void setsockopt_so_recvbuf(int sock, int size);
+extern void setsockopt_so_sendbuf(const int sock, int size);
+extern int getsockopt_so_sendbuf(const int sock);
+extern int getsockopt_so_recvbuf(const int sock);
+
+extern int setsockopt_ipv6_pktinfo(int, int);
+extern int setsockopt_ipv6_multicast_hops(int, int);
+extern int setsockopt_ipv6_unicast_hops(int, int);
+extern int setsockopt_ipv6_hoplimit(int, int);
+extern int setsockopt_ipv6_multicast_loop(int, int);
+extern int setsockopt_ipv6_tclass(int, int);
+
+#define SOPT_SIZE_CMSG_PKTINFO_IPV6() (sizeof(struct in6_pktinfo));
+
+/*
+ * Size defines for control messages used to get ifindex. We define
+ * values for each method, and define a macro that can be used by code
+ * that is unaware of which method is in use.
+ * These values are without any alignment needed (see CMSG_SPACE in RFC3542).
+ */
+#if defined(IP_PKTINFO)
+/* Linux in_pktinfo. */
+#define SOPT_SIZE_CMSG_PKTINFO_IPV4() (CMSG_SPACE(sizeof(struct in_pktinfo)))
+/* XXX This should perhaps be defined even if IP_PKTINFO is not. */
+#define SOPT_SIZE_CMSG_PKTINFO(af) \
+ ((af == AF_INET) ? SOPT_SIZE_CMSG_PKTINFO_IPV4() \
+ : SOPT_SIZE_CMSG_PKTINFO_IPV6()
+#endif /* IP_PKTINFO */
+
+#if defined(IP_RECVIF)
+/* BSD/Solaris */
+
+#define SOPT_SIZE_CMSG_RECVIF_IPV4() (sizeof(struct sockaddr_dl))
+#endif /* IP_RECVIF */
+
+/* SOPT_SIZE_CMSG_IFINDEX_IPV4 - portable type */
+#if defined(SOPT_SIZE_CMSG_PKTINFO)
+#define SOPT_SIZE_CMSG_IFINDEX_IPV4() SOPT_SIZE_CMSG_PKTINFO_IPV4()
+#elif defined(SOPT_SIZE_CMSG_RECVIF_IPV4)
+#define SOPT_SIZE_CMSG_IFINDEX_IPV4() SOPT_SIZE_CMSG_RECVIF_IPV4()
+#else /* Nothing available */
+#define SOPT_SIZE_CMSG_IFINDEX_IPV4() (sizeof(char *))
+#endif /* SOPT_SIZE_CMSG_IFINDEX_IPV4 */
+
+#define SOPT_SIZE_CMSG_IFINDEX(af) \
+ (((af) == AF_INET) : SOPT_SIZE_CMSG_IFINDEX_IPV4() \
+ ? SOPT_SIZE_CMSG_PKTINFO_IPV6())
+
+extern int setsockopt_ipv4_multicast_if(int sock, struct in_addr if_addr,
+ ifindex_t ifindex);
+extern int setsockopt_ipv4_multicast(int sock, int optname,
+ struct in_addr if_addr,
+ unsigned int mcast_addr,
+ ifindex_t ifindex);
+extern int setsockopt_ipv4_multicast_loop(int sock, uint8_t val);
+
+extern int setsockopt_ipv4_tos(int sock, int tos);
+
+/* Ask for, and get, ifindex, by whatever method is supported. */
+extern int setsockopt_ifindex(int, int, ifindex_t);
+extern ifindex_t getsockopt_ifindex(int, struct msghdr *);
+
+/* swab the fields in iph between the host order and system order expected
+ * for IP_HDRINCL.
+ */
+extern void sockopt_iphdrincl_swab_htosys(struct ip *iph);
+extern void sockopt_iphdrincl_swab_systoh(struct ip *iph);
+
+extern int sockopt_tcp_rtt(int);
+
+/*
+ * TCP MD5 signature option. This option allows TCP MD5 to be enabled on
+ * addresses.
+ *
+ * sock
+ * Socket to enable option on.
+ *
+ * su
+ * Sockunion specifying address to enable option on.
+ *
+ * password
+ * MD5 auth password
+ */
+extern int sockopt_tcp_signature(int sock, union sockunion *su,
+ const char *password);
+
+/*
+ * Extended TCP MD5 signature option. This option allows TCP MD5 to be enabled
+ * on prefixes.
+ *
+ * sock
+ * Socket to enable option on.
+ *
+ * su
+ * Sockunion specifying address (or prefix) to enable option on.
+ *
+ * prefixlen
+ * 0 - su is an address; fall back to non-extended mode
+ * Else - su is a prefix; prefixlen is the mask length
+ *
+ * password
+ * MD5 auth password
+ */
+extern int sockopt_tcp_signature_ext(int sock, union sockunion *su,
+ uint16_t prefixlen, const char *password);
+
+/*
+ * set TCP max segment size. This option allows user to configure
+ * max segment size for TCP session
+ *
+ * sock
+ * Socket to enable option on.
+ *
+ * tcp_maxseg
+ * value used for TCP segment size negotiation during SYN
+ */
+extern int sockopt_tcp_mss_set(int sock, int tcp_maxseg);
+
+/*
+ * get TCP max segment size. This option allows user to get
+ * the segment size for TCP session
+ *
+ * sock
+ * Socket to get max segement size.
+ */
+extern int sockopt_tcp_mss_get(int sock);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_ZEBRA_SOCKOPT_H */