Code cleanup
This commit is contained in:
44
mud.c
44
mud.c
@@ -664,9 +664,31 @@ int mud_is_up (struct mud *mud)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
struct cmsghdr *mud_get_pktinfo (struct msghdr *msg, int family)
|
||||||
|
{
|
||||||
|
int cmsg_level = IPPROTO_IP;
|
||||||
|
int cmsg_type = IP_PKTINFO;
|
||||||
|
|
||||||
|
if (family == AF_INET6) {
|
||||||
|
cmsg_level = IPPROTO_IPV6;
|
||||||
|
cmsg_type = IPV6_PKTINFO;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cmsghdr *cmsg = CMSG_FIRSTHDR(msg);
|
||||||
|
|
||||||
|
for (; cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
|
||||||
|
if ((cmsg->cmsg_level == cmsg_level) &&
|
||||||
|
(cmsg->cmsg_type == cmsg_type))
|
||||||
|
return cmsg;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int mud_pull (struct mud *mud)
|
int mud_pull (struct mud *mud)
|
||||||
{
|
{
|
||||||
unsigned char ctrl[1024];
|
unsigned char ctrl[256];
|
||||||
|
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
unsigned next = MUD_PACKET_NEXT(mud->rx.end);
|
unsigned next = MUD_PACKET_NEXT(mud->rx.end);
|
||||||
@@ -707,28 +729,14 @@ int mud_pull (struct mud *mud)
|
|||||||
|
|
||||||
mud_unmapv4((struct sockaddr *)&addr);
|
mud_unmapv4((struct sockaddr *)&addr);
|
||||||
|
|
||||||
int cmsg_level = IPPROTO_IP;
|
struct cmsghdr *cmsg = mud_get_pktinfo(&msg, addr.ss_family);
|
||||||
int cmsg_type = IP_PKTINFO;
|
|
||||||
|
|
||||||
if (addr.ss_family == AF_INET6) {
|
|
||||||
cmsg_level = IPPROTO_IPV6;
|
|
||||||
cmsg_type = IPV6_PKTINFO;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
|
|
||||||
|
|
||||||
for (; cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
|
|
||||||
if ((cmsg->cmsg_level == cmsg_level) &&
|
|
||||||
(cmsg->cmsg_type == cmsg_type))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!cmsg)
|
if (!cmsg)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
unsigned index = 0;
|
unsigned index = 0;
|
||||||
|
|
||||||
if (cmsg_level == IPPROTO_IP) {
|
if (cmsg->cmsg_level == IPPROTO_IP) {
|
||||||
memcpy(&index,
|
memcpy(&index,
|
||||||
&((struct in_pktinfo *)CMSG_DATA(cmsg))->ipi_ifindex,
|
&((struct in_pktinfo *)CMSG_DATA(cmsg))->ipi_ifindex,
|
||||||
sizeof(index));
|
sizeof(index));
|
||||||
@@ -748,7 +756,7 @@ int mud_pull (struct mud *mud)
|
|||||||
|
|
||||||
struct cmsghdr *send_cmsg = CMSG_FIRSTHDR(&send_msg);
|
struct cmsghdr *send_cmsg = CMSG_FIRSTHDR(&send_msg);
|
||||||
|
|
||||||
if (cmsg_level == IPPROTO_IP) {
|
if (cmsg->cmsg_level == IPPROTO_IP) {
|
||||||
memcpy(&((struct in_pktinfo *)CMSG_DATA(send_cmsg))->ipi_spec_dst,
|
memcpy(&((struct in_pktinfo *)CMSG_DATA(send_cmsg))->ipi_spec_dst,
|
||||||
&((struct in_pktinfo *)CMSG_DATA(cmsg))->ipi_addr,
|
&((struct in_pktinfo *)CMSG_DATA(cmsg))->ipi_addr,
|
||||||
sizeof(struct in_addr));
|
sizeof(struct in_addr));
|
||||||
|
|||||||
Reference in New Issue
Block a user