mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-12 14:01:11 +00:00
lib: futher simplification of setsockopt_ipv4_multicast()
* sockopt.c (setsockopt_ipv4_multicast): check for wrong optname with assert(), rather than return an error.
This commit is contained in:
parent
e0afa6f44a
commit
ee7e75d38b
108
lib/sockopt.c
108
lib/sockopt.c
@ -214,42 +214,31 @@ setsockopt_ipv4_multicast(int sock,
|
|||||||
struct ip_mreqn mreqn;
|
struct ip_mreqn mreqn;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
switch (optname)
|
assert(optname == IP_ADD_MEMBERSHIP || optname == IP_DROP_MEMBERSHIP);
|
||||||
|
memset (&mreqn, 0, sizeof(mreqn));
|
||||||
|
|
||||||
|
if (mcast_addr)
|
||||||
|
mreqn.imr_multiaddr.s_addr = mcast_addr;
|
||||||
|
|
||||||
|
mreqn.imr_ifindex = ifindex;
|
||||||
|
|
||||||
|
ret = setsockopt(sock, IPPROTO_IP, optname,
|
||||||
|
(void *)&mreqn, sizeof(mreqn));
|
||||||
|
if ((ret < 0) && (optname == IP_ADD_MEMBERSHIP) && (errno == EADDRINUSE))
|
||||||
{
|
{
|
||||||
case IP_ADD_MEMBERSHIP:
|
/* see above: handle possible problem when interface comes back up */
|
||||||
case IP_DROP_MEMBERSHIP:
|
char buf[1][INET_ADDRSTRLEN];
|
||||||
memset (&mreqn, 0, sizeof(mreqn));
|
zlog_info("setsockopt_ipv4_multicast attempting to drop and "
|
||||||
|
"re-add (fd %d, mcast %s, ifindex %u)",
|
||||||
if (mcast_addr)
|
sock,
|
||||||
mreqn.imr_multiaddr.s_addr = mcast_addr;
|
inet_ntop(AF_INET, &mreqn.imr_multiaddr,
|
||||||
|
buf[0], sizeof(buf[0])), ifindex);
|
||||||
mreqn.imr_ifindex = ifindex;
|
setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
|
||||||
|
(void *)&mreqn, sizeof(mreqn));
|
||||||
ret = setsockopt(sock, IPPROTO_IP, optname,
|
ret = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
(void *)&mreqn, sizeof(mreqn));
|
(void *)&mreqn, sizeof(mreqn));
|
||||||
if ((ret < 0) && (optname == IP_ADD_MEMBERSHIP) && (errno == EADDRINUSE))
|
|
||||||
{
|
|
||||||
/* see above: handle possible problem when interface comes back up */
|
|
||||||
char buf[1][INET_ADDRSTRLEN];
|
|
||||||
zlog_info("setsockopt_ipv4_multicast attempting to drop and "
|
|
||||||
"re-add (fd %d, mcast %s, ifindex %u)",
|
|
||||||
sock,
|
|
||||||
inet_ntop(AF_INET, &mreqn.imr_multiaddr,
|
|
||||||
buf[0], sizeof(buf[0])), ifindex);
|
|
||||||
setsockopt(sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
|
|
||||||
(void *)&mreqn, sizeof(mreqn));
|
|
||||||
ret = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
|
||||||
(void *)&mreqn, sizeof(mreqn));
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* Can out and give an understandable error */
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
|
|
||||||
/* Example defines for another OS, boilerplate off other code in this
|
/* Example defines for another OS, boilerplate off other code in this
|
||||||
function, AND handle optname as per other sections for consistency !! */
|
function, AND handle optname as per other sections for consistency !! */
|
||||||
@ -263,40 +252,31 @@ setsockopt_ipv4_multicast(int sock,
|
|||||||
struct ip_mreq mreq;
|
struct ip_mreq mreq;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
assert(optname == IP_ADD_MEMBERSHIP || optname == IP_DROP_MEMBERSHIP);
|
||||||
|
|
||||||
m.s_addr = htonl(ifindex);
|
m.s_addr = htonl(ifindex);
|
||||||
|
|
||||||
switch (optname)
|
memset (&mreq, 0, sizeof(mreq));
|
||||||
|
mreq.imr_multiaddr.s_addr = mcast_addr;
|
||||||
|
mreq.imr_interface = m;
|
||||||
|
|
||||||
|
ret = setsockopt (sock, IPPROTO_IP, optname, (void *)&mreq, sizeof(mreq));
|
||||||
|
if ((ret < 0) && (optname == IP_ADD_MEMBERSHIP) && (errno == EADDRINUSE))
|
||||||
{
|
{
|
||||||
case IP_ADD_MEMBERSHIP:
|
/* see above: handle possible problem when interface comes back up */
|
||||||
case IP_DROP_MEMBERSHIP:
|
char buf[1][INET_ADDRSTRLEN];
|
||||||
memset (&mreq, 0, sizeof(mreq));
|
zlog_info("setsockopt_ipv4_multicast attempting to drop and "
|
||||||
mreq.imr_multiaddr.s_addr = mcast_addr;
|
"re-add (fd %d, mcast %s, ifindex %u)",
|
||||||
mreq.imr_interface = m;
|
sock,
|
||||||
|
inet_ntop(AF_INET, &mreq.imr_multiaddr,
|
||||||
ret = setsockopt (sock, IPPROTO_IP, optname, (void *)&mreq, sizeof(mreq));
|
buf[0], sizeof(buf[0])), ifindex);
|
||||||
if ((ret < 0) && (optname == IP_ADD_MEMBERSHIP) && (errno == EADDRINUSE))
|
setsockopt (sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
|
||||||
{
|
(void *)&mreq, sizeof(mreq));
|
||||||
/* see above: handle possible problem when interface comes back up */
|
ret = setsockopt (sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
char buf[1][INET_ADDRSTRLEN];
|
(void *)&mreq, sizeof(mreq));
|
||||||
zlog_info("setsockopt_ipv4_multicast attempting to drop and "
|
|
||||||
"re-add (fd %d, mcast %s, ifindex %u)",
|
|
||||||
sock,
|
|
||||||
inet_ntop(AF_INET, &mreq.imr_multiaddr,
|
|
||||||
buf[0], sizeof(buf[0])), ifindex);
|
|
||||||
setsockopt (sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
|
|
||||||
(void *)&mreq, sizeof(mreq));
|
|
||||||
ret = setsockopt (sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
|
||||||
(void *)&mreq, sizeof(mreq));
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
/* Can out and give an understandable error */
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
return ret;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error "Unsupported multicast API"
|
#error "Unsupported multicast API"
|
||||||
#endif /* #if OS_TYPE */
|
#endif /* #if OS_TYPE */
|
||||||
|
Loading…
Reference in New Issue
Block a user