mirror of
https://github.com/FRRouting/frr.git
synced 2026-01-16 23:14:01 +00:00
Our coding standard is that all function declarations should have actual function names. Let's try to clean up all that is missing this in lib. Signed-off-by: Donald Sharp <sharpd@nvidia.com>
131 lines
4.5 KiB
C
131 lines
4.5 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Socket union header.
|
|
* Copyright (c) 1997 Kunihiro Ishiguro
|
|
*/
|
|
|
|
#ifndef _ZEBRA_SOCKUNION_H
|
|
#define _ZEBRA_SOCKUNION_H
|
|
|
|
#include "compiler.h"
|
|
|
|
#include "privs.h"
|
|
#include "if.h"
|
|
#include <sys/un.h>
|
|
#ifdef __OpenBSD__
|
|
#include <net/route.h>
|
|
#include <netmpls/mpls.h>
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
union sockunion {
|
|
struct sockaddr sa;
|
|
struct sockaddr_in sin;
|
|
struct sockaddr_in6 sin6;
|
|
struct sockaddr_un sun;
|
|
#ifdef __OpenBSD__
|
|
struct sockaddr_mpls smpls;
|
|
struct sockaddr_rtlabel rtlabel;
|
|
#endif
|
|
|
|
/* sockaddr_storage is guaranteed to be larger than the others */
|
|
struct sockaddr_storage sa_storage;
|
|
};
|
|
|
|
/* clang-format off */
|
|
/* for functions that want to accept any sockaddr pointer without casts */
|
|
union sockaddrptr {
|
|
uniontype(sockaddrptr, union sockunion, su)
|
|
uniontype(sockaddrptr, struct sockaddr, sa)
|
|
uniontype(sockaddrptr, struct sockaddr_in, sin)
|
|
uniontype(sockaddrptr, struct sockaddr_in6, sin6)
|
|
uniontype(sockaddrptr, struct sockaddr_un, sun)
|
|
#ifdef __OpenBSD__
|
|
uniontype(sockaddrptr, struct sockaddr_mpls, smpls)
|
|
uniontype(sockaddrptr, struct sockaddr_rtlabel, rtlabel)
|
|
#endif
|
|
uniontype(sockaddrptr, struct sockaddr_storage, sa_storage)
|
|
} TRANSPARENT_UNION;
|
|
|
|
union sockaddrconstptr {
|
|
uniontype(sockaddrconstptr, const union sockunion, su)
|
|
uniontype(sockaddrconstptr, const struct sockaddr, sa)
|
|
uniontype(sockaddrconstptr, const struct sockaddr_in, sin)
|
|
uniontype(sockaddrconstptr, const struct sockaddr_in6, sin6)
|
|
uniontype(sockaddrconstptr, const struct sockaddr_un, sun)
|
|
#ifdef __OpenBSD__
|
|
uniontype(sockaddrconstptr, const struct sockaddr_mpls, smpls)
|
|
uniontype(sockaddrconstptr, const struct sockaddr_rtlabel, rtlabel)
|
|
#endif
|
|
uniontype(sockaddrconstptr, const struct sockaddr_storage, sa_storage)
|
|
} TRANSPARENT_UNION;
|
|
/* clang-format on */
|
|
|
|
enum connect_result { connect_error, connect_success, connect_in_progress };
|
|
|
|
/* Default address family. */
|
|
#define AF_INET_UNION AF_INET6
|
|
|
|
/* Sockunion address string length. Same as INET6_ADDRSTRLEN. */
|
|
#define SU_ADDRSTRLEN 46
|
|
|
|
#define sockunion_family(X) (X)->sa.sa_family
|
|
|
|
#define sockunion2ip(X) (X)->sin.sin_addr.s_addr
|
|
|
|
/* Prototypes. */
|
|
extern int str2sockunion(const char *str, union sockunion *su);
|
|
extern const char *sockunion2str(const union sockunion *su, char *buf,
|
|
size_t len);
|
|
extern int sockunion_cmp(const union sockunion *su1, const union sockunion *su2);
|
|
extern int sockunion_same(const union sockunion *su1, const union sockunion *su2);
|
|
extern unsigned int sockunion_hash(const union sockunion *su);
|
|
|
|
extern size_t family2addrsize(int family);
|
|
extern size_t sockunion_get_addrlen(const union sockunion *su);
|
|
extern const uint8_t *sockunion_get_addr(const union sockunion *);
|
|
extern void sockunion_set(union sockunion *su, int family, const uint8_t *addr, size_t bytes);
|
|
|
|
extern union sockunion *sockunion_str2su(const char *str);
|
|
extern int sockunion_accept(int sock, union sockunion *su);
|
|
extern int sockunion_sizeof(const union sockunion *su);
|
|
extern int sockunion_stream_socket(union sockunion *su);
|
|
extern int sockopt_reuseaddr(int sock);
|
|
extern int sockopt_reuseport(int sock);
|
|
extern int sockopt_v6only(int family, int sock);
|
|
extern int sockunion_bind(int sock, union sockunion *su, unsigned short port,
|
|
union sockunion *su_addr);
|
|
extern int sockopt_ttl(int family, int sock, int ttl);
|
|
extern int sockopt_minttl(int family, int sock, int minttl);
|
|
extern int sockunion_socket(const union sockunion *su);
|
|
extern const char *inet_sutop(const union sockunion *su, char *str);
|
|
extern enum connect_result sockunion_connect(int fd, const union sockunion *su, unsigned short port);
|
|
extern union sockunion *sockunion_getsockname(int);
|
|
extern union sockunion *sockunion_getpeername(int);
|
|
extern union sockunion *sockunion_dup(const union sockunion *);
|
|
extern void sockunion_free(union sockunion *su);
|
|
extern void sockunion_init(union sockunion *su);
|
|
extern int sockunion_is_null(const union sockunion *su);
|
|
|
|
#ifdef _FRR_ATTRIBUTE_PRINTFRR
|
|
#pragma FRR printfrr_ext "%pSU" (union sockunion *)
|
|
#pragma FRR printfrr_ext "%pSU" (struct sockaddr *)
|
|
#pragma FRR printfrr_ext "%pSU" (struct sockaddr_storage *)
|
|
#pragma FRR printfrr_ext "%pSU" (struct sockaddr_in *)
|
|
#pragma FRR printfrr_ext "%pSU" (struct sockaddr_in6 *)
|
|
#pragma FRR printfrr_ext "%pSU" (struct sockaddr_un *)
|
|
|
|
/* AF_INET/PF_INET & co., using "PF" to avoid confusion with AFI/SAFI */
|
|
#pragma FRR printfrr_ext "%dPF" (int)
|
|
/* SOCK_STREAM & co. */
|
|
#pragma FRR printfrr_ext "%dSO" (int)
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _ZEBRA_SOCKUNION_H */
|