mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 00:56:19 +00:00
sockunion: add accessors for sockunion address
Upcoming nhrp code will use this, and it can be used to remove the sockunion2ip(X) macro. Signed-off-by: Timo Teräs <timo.teras@iki.fi> Signed-off-by: David Lamparter <equinox@opensourcerouting.org> (cherry picked from commit 483abc037b0ac4b3ed168c4810bb14ea338fa80c)
This commit is contained in:
parent
cf279b3abc
commit
95e0999cc5
@ -623,6 +623,62 @@ sockunion_hash (const union sockunion *su)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
family2addrsize(int family)
|
||||||
|
{
|
||||||
|
switch (family)
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
return sizeof(struct in_addr);
|
||||||
|
#ifdef HAVE_IPV6
|
||||||
|
case AF_INET6:
|
||||||
|
return sizeof(struct in6_addr);
|
||||||
|
#endif /* HAVE_IPV6 */
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
sockunion_get_addrlen(const union sockunion *su)
|
||||||
|
{
|
||||||
|
return family2addrsize(sockunion_family(su));
|
||||||
|
}
|
||||||
|
|
||||||
|
const u_char *
|
||||||
|
sockunion_get_addr(const union sockunion *su)
|
||||||
|
{
|
||||||
|
switch (sockunion_family(su))
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
return (const u_char *) &su->sin.sin_addr.s_addr;
|
||||||
|
#ifdef HAVE_IPV6
|
||||||
|
case AF_INET6:
|
||||||
|
return (const u_char *) &su->sin6.sin6_addr;
|
||||||
|
#endif /* HAVE_IPV6 */
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sockunion_set(union sockunion *su, int family, const u_char *addr, size_t bytes)
|
||||||
|
{
|
||||||
|
if (family2addrsize(family) != bytes)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sockunion_family(su) = family;
|
||||||
|
switch (family)
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
memcpy(&su->sin.sin_addr.s_addr, addr, bytes);
|
||||||
|
break;
|
||||||
|
#ifdef HAVE_IPV6
|
||||||
|
case AF_INET6:
|
||||||
|
memcpy(&su->sin6.sin6_addr, addr, bytes);
|
||||||
|
break;
|
||||||
|
#endif /* HAVE_IPV6 */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* After TCP connection is established. Get local address and port. */
|
/* After TCP connection is established. Get local address and port. */
|
||||||
union sockunion *
|
union sockunion *
|
||||||
sockunion_getsockname (int fd)
|
sockunion_getsockname (int fd)
|
||||||
|
@ -74,6 +74,11 @@ extern int sockunion_cmp (union sockunion *, union sockunion *);
|
|||||||
extern int sockunion_same (const union sockunion *, const union sockunion *);
|
extern int sockunion_same (const union sockunion *, const union sockunion *);
|
||||||
extern unsigned int sockunion_hash (const union sockunion *);
|
extern unsigned int sockunion_hash (const union sockunion *);
|
||||||
|
|
||||||
|
extern size_t family2addrsize(int family);
|
||||||
|
extern size_t sockunion_get_addrlen(const union sockunion *);
|
||||||
|
extern const u_char *sockunion_get_addr(const union sockunion *);
|
||||||
|
extern void sockunion_set(union sockunion *, int family, const u_char *addr, size_t bytes);
|
||||||
|
|
||||||
extern union sockunion *sockunion_str2su (const char *str);
|
extern union sockunion *sockunion_str2su (const char *str);
|
||||||
extern int sockunion_accept (int sock, union sockunion *);
|
extern int sockunion_accept (int sock, union sockunion *);
|
||||||
extern int sockunion_stream_socket (union sockunion *);
|
extern int sockunion_stream_socket (union sockunion *);
|
||||||
|
Loading…
Reference in New Issue
Block a user