summaryrefslogtreecommitdiff
path: root/igmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'igmp.c')
-rw-r--r--igmp.c115
1 files changed, 62 insertions, 53 deletions
diff --git a/igmp.c b/igmp.c
index 36f63e2..9ada4e4 100644
--- a/igmp.c
+++ b/igmp.c
@@ -173,7 +173,7 @@ igmp_match()
struct tm *tm = localtime(&t);
char s[64];
strftime(s, sizeof(s), "%c", tm);
- debug(DBG_IGMP, "multicast request discovered at: %s\n", s);
+ debug(DBG_IGMP, "multicast request discovered at: %s", s);
//start announce
}
@@ -218,7 +218,7 @@ igmp_parse(struct cfg *cfg, struct igmp *igmp)
switch (igmp_msg->common.type) {
case IGMP_V1_MEMBERSHIP_REPORT:
- debug(DBG_IGMP, "igmp_v1_membership_report\n");
+ debug(DBG_IGMP, "igmp_v1_membership_report");
/* fall through */
case IGMP_V2_MEMBERSHIP_REPORT: {
@@ -236,29 +236,29 @@ igmp_parse(struct cfg *cfg, struct igmp *igmp)
grp.s_addr = htonl(igmp_msg->v2.addr);
inet_ntop(AF_INET, &grp, grp_str, sizeof(grp_str));
- debug(DBG_IGMP, "igmp_v2_membership_report %s -> %s (%s)\n",
+ debug(DBG_IGMP, "igmp_v2_membership_report %s -> %s (%s)",
src_str, dst_str, grp_str);
if (body_len != IGMP_MIN_LEN) {
- error("IGMPv2 invalid size\n");
+ error("IGMPv2 invalid size");
break;
}
if (!csum_valid((char *)igmp_msg, body_len)) {
- error("IGMPv2 invalid checksum\n");
+ error("IGMPv2 invalid checksum");
break;
}
- debug(DBG_IGMP, "Inet addr: 0x%x\n", inet_addr("224.0.2.60"));
- debug(DBG_IGMP, "Inet addr: 0x%x\n", cinet_addr(224,0,2,60));
- debug(DBG_IGMP, "Inet addr: 0x%x\n", chtobe32(cinet_addr(224,0,2,60)));
+ debug(DBG_IGMP, "Inet addr: 0x%x", inet_addr("224.0.2.60"));
+ debug(DBG_IGMP, "Inet addr: 0x%x", cinet_addr(224,0,2,60));
+ debug(DBG_IGMP, "Inet addr: 0x%x", chtobe32(cinet_addr(224,0,2,60)));
if (htonl(hdr->dst) != cinet_addr(224,0,2,60)) {
- debug(DBG_IGMP, "IGMPv2 invalid dst addr\n");
+ debug(DBG_IGMP, "IGMPv2 invalid dst addr");
break;
}
if (htonl(igmp_msg->v2.addr) != cinet_addr(224,0,2,60)) {
- debug(DBG_IGMP, "IGMPv2 invalid grp addr\n");
+ debug(DBG_IGMP, "IGMPv2 invalid grp addr");
break;
}
@@ -278,7 +278,7 @@ igmp_parse(struct cfg *cfg, struct igmp *igmp)
dst.s_addr = htonl(hdr->dst);
inet_ntop(AF_INET, &dst, dst_str, sizeof(dst_str));
- debug(DBG_IGMP, "igmp_v3_membership_report %s -> %s\n",
+ debug(DBG_IGMP, "igmp_v3_membership_report %s -> %s",
src_str, dst_str);
debug(DBG_IGMP, "IGMPv3\n"
@@ -287,7 +287,7 @@ igmp_parse(struct cfg *cfg, struct igmp *igmp)
" * Csum: %u\n"
" * Reserved: %u\n"
" * NRecs: %u\n"
- " * Size: %zu bytes\n",
+ " * Size: %zu bytes",
igmp_msg->v3.type,
igmp_msg->v3.reserved1,
igmp_msg->v3.checksum,
@@ -296,12 +296,12 @@ igmp_parse(struct cfg *cfg, struct igmp *igmp)
sizeof(igmp_msg->v3));
if (!csum_valid(pos, body_len)) {
- error("IGMPv3 csum invalid\n");
+ error("IGMPv3 csum invalid");
break;
}
if (htonl(hdr->dst) != cinet_addr(224,0,0,22)) {
- debug(DBG_IGMP, "IGMPv2 invalid dst addr\n");
+ debug(DBG_IGMP, "IGMPv2 invalid dst addr");
break;
}
@@ -314,20 +314,20 @@ igmp_parse(struct cfg *cfg, struct igmp *igmp)
char grp_str[INET_ADDRSTRLEN];
if (body_len < sizeof(*record)) {
- error("IGMPv3 too short\n");
+ error("IGMPv3 too short");
break;
}
grp.s_addr = htonl(record->addr);
inet_ntop(AF_INET, &grp, grp_str, sizeof(grp_str));
- debug(DBG_IGMP, "received IGMPv3 record to %s\n", grp_str);
-
- debug(DBG_IGMP, "IGMPv3 rec\n"
- " * Type: %u\n"
- " * Auxlen: %u\n"
- " * NSrcs: %u\n"
- " * Addr: %s\n"
- " * Size: %zu bytes\n",
+ debug(DBG_IGMP, "received IGMPv3 record to %s", grp_str);
+
+ debug(DBG_IGMP, "IGMPv3 rec"
+ " * Type: %un"
+ " * Auxlen: %u"
+ " * NSrcs: %u"
+ " * Addr: %s"
+ " * Size: %zu bytes",
record->type,
record->auxlen,
record->nsrcs,
@@ -338,7 +338,7 @@ igmp_parse(struct cfg *cfg, struct igmp *igmp)
pos += sizeof(*record);
if (body_len < record->nsrcs * sizeof(uint32_t) + record->auxlen) {
- error("IGMPv3 too short\n");
+ error("IGMPv3 too short");
break;
}
@@ -348,7 +348,7 @@ igmp_parse(struct cfg *cfg, struct igmp *igmp)
grp_src.s_addr = htonl(record->saddr[addr]);
inet_ntop(AF_INET, &grp_src, grp_src_str, sizeof(grp_src_str));
- debug(DBG_IGMP, "received IGMPv3 record src %s\n",
+ debug(DBG_IGMP, "received IGMPv3 record src %s",
grp_src_str);
body_len -= sizeof(record->saddr[addr]);
@@ -368,15 +368,15 @@ igmp_parse(struct cfg *cfg, struct igmp *igmp)
}
case IGMP_MEMBERSHIP_QUERY:
- debug(DBG_IGMP, "igmp_membership_query\n");
+ debug(DBG_IGMP, "igmp_membership_query");
break;
case IGMP_V2_LEAVE_GROUP:
- debug(DBG_IGMP, "igmp_v2_leave_group\n");
+ debug(DBG_IGMP, "igmp_v2_leave_group");
break;
default:
- debug(DBG_IGMP, "IGMP msg type %02hhx\n", igmp_msg->common.type);
+ debug(DBG_IGMP, "IGMP msg type %02hhx", igmp_msg->common.type);
break;
}
@@ -389,12 +389,12 @@ igmp_read_cb(struct cfg *cfg, struct uring_task *task, int res)
{
struct igmp *igmp = container_of(task, struct igmp, task);
- debug(DBG_IGMP, "task %p, igmp %p, res %i\n", task, igmp, res);
+ debug(DBG_IGMP, "task %p, igmp %p, res %i", task, igmp, res);
assert_task_alive(DBG_IGMP, task);
if (res < 0) {
- error("res: %i\n", res);
+ error("res: %i", res);
return;
}
@@ -404,7 +404,7 @@ igmp_read_cb(struct cfg *cfg, struct uring_task *task, int res)
task->saddr.ll.sll_protocol == htons(ETH_P_IP))
igmp_parse(cfg, igmp);
else
- debug(DBG_IGMP, "invalid packet type received\n");
+ debug(DBG_IGMP, "invalid packet type received");
uring_tbuf_read(cfg, &igmp->task, igmp_read_cb);
}
@@ -414,7 +414,7 @@ igmp_free(struct uring_task *task)
{
struct igmp *igmp = container_of(task, struct igmp, task);
- debug(DBG_IGMP, "task %p, igmp %p\n", task, igmp);
+ debug(DBG_IGMP, "task %p, igmp %p", task, igmp);
xfree(igmp);
}
@@ -435,7 +435,7 @@ igmp_delete(struct cfg *cfg)
if (!igmp)
return;
- debug(DBG_IGMP, "closing fd %i\n", igmp->task.fd);
+ debug(DBG_IGMP, "closing fd %i", igmp->task.fd);
uring_task_destroy(cfg, &igmp->task);
cfg->igmp = NULL;
}
@@ -498,7 +498,7 @@ igmp_init(struct cfg *cfg)
int opt;
if (!cfg->do_igmp) {
- debug(DBG_IGMP, "igmp snooping disabled\n");
+ debug(DBG_IGMP, "igmp snooping disabled");
return;
}
@@ -513,17 +513,21 @@ igmp_init(struct cfg *cfg)
sfd = socket(AF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_ALL));
if (sfd < 0) {
if (errno == EACCES || errno == EPERM)
- error("permission denied\n");
+ error("permission denied");
else
- error("%m\n");
- goto error_free;
+ error("%mn");
+ goto error;
}
- if (setsockopt(sfd, SOL_SOCKET, SO_ATTACH_FILTER, &fprog, sizeof(fprog)) < 0)
- die("setsockopt(SO_ATTACH_FILTER): %m");
+ if (setsockopt(sfd, SOL_SOCKET, SO_ATTACH_FILTER, &fprog, sizeof(fprog)) < 0) {
+ error("setsockopt(SO_ATTACH_FILTER): %m");
+ goto error;
+ }
- if (setsockopt(sfd, SOL_SOCKET, SO_LOCK_FILTER, &opt, sizeof(opt)) < 0)
- die("setsockopt(SO_LOCK_FILTER): %m");
+ if (setsockopt(sfd, SOL_SOCKET, SO_LOCK_FILTER, &opt, sizeof(opt)) < 0) {
+ error("setsockopt(SO_LOCK_FILTER): %m");
+ goto error;
+ }
if (cfg->igmp_iface) {
struct ifreq ifreq;
@@ -531,13 +535,17 @@ igmp_init(struct cfg *cfg)
r = snprintf(ifreq.ifr_name, sizeof(ifreq.ifr_name),
"%s", cfg->igmp_iface);
- if (r < 0 || r >= sizeof(ifreq.ifr_name))
- die("invalid interface name");
+ if (r < 0 || r >= sizeof(ifreq.ifr_name)) {
+ error("invalid interface name");
+ goto error;
+ }
- if (ioctl(sfd, SIOCGIFINDEX, &ifreq) < 0)
- perrordie("ioctl");
+ if (ioctl(sfd, SIOCGIFINDEX, &ifreq) < 0) {
+ error("ioctl: %m");
+ goto error;
+ }
- debug(DBG_IGMP, "using interface %s (%i)\n",
+ debug(DBG_IGMP, "using interface %s (%i)",
cfg->igmp_iface, ifreq.ifr_ifindex);
struct packet_mreq mreq = {
@@ -546,17 +554,19 @@ igmp_init(struct cfg *cfg)
};
if (setsockopt(sfd, SOL_PACKET, PACKET_ADD_MEMBERSHIP,
- &mreq, sizeof(mreq)) < 0)
- die("setsockopt(PACKET_ADD_MEMBERSHIP): %m");
+ &mreq, sizeof(mreq)) < 0) {
+ error("setsockopt(PACKET_ADD_MEMBERSHIP): %m");
+ goto error;
+ }
}
/* can't set .sll_protocol to htons(ETH_P_IP), see comment above */
if (bind(sfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
- error("bind: %m\n");
- goto error_fd;
+ error("bind: %m");
+ goto error;
}
- debug(DBG_IGMP, "init successful, using fd %i\n", sfd);
+ debug(DBG_IGMP, "init successful, using fd %i", sfd);
uring_task_init(&igmp->task, "igmp", uring_parent(cfg), igmp_free);
uring_task_set_fd(&igmp->task, sfd);
uring_task_set_buf(&igmp->task, &igmp->tbuf);
@@ -567,8 +577,7 @@ igmp_init(struct cfg *cfg)
return;
-error_fd:
+error:
close(sfd);
-error_free:
xfree(igmp);
}