diff --git a/src/bind.c b/src/bind.c index b98a5bb..e8e8cb8 100644 --- a/src/bind.c +++ b/src/bind.c @@ -288,6 +288,28 @@ gt_bind(int argc, char **argv) if (mud_set_state(mud, (struct sockaddr *)&req.path.addr, req.path.state)) res.ret = errno; break; + case CTL_PATH_STATUS: + { + unsigned count = 0; + struct mud_path *paths = mud_get_paths(mud, &count); + + if (!paths) { + res.ret = errno; + break; + } + + res.ret = EAGAIN; + + for (unsigned i = 0; i < count; i++) { + if (i && sendto(ctl_fd, &res, sizeof(res), 0, + (const struct sockaddr *)&ss, sl) == -1) + perror("sendto(ctl)"); + memcpy(&res.path_status, &paths[i], sizeof(struct mud_path)); + } + + res.ret = 0; + } + break; case CTL_MTU: mud_set_mtu(mud, GT_MTU((size_t)req.mtu)); res.mtu = gt_setup_mtu(mud, tun_name); diff --git a/src/ctl.h b/src/ctl.h index f94df1b..7421b40 100644 --- a/src/ctl.h +++ b/src/ctl.h @@ -11,6 +11,7 @@ enum ctl_type { CTL_MTU, CTL_TIMEOUT, CTL_TIMETOLERANCE, + CTL_PATH_STATUS, }; struct ctl_msg { @@ -21,6 +22,7 @@ struct ctl_msg { struct sockaddr_storage addr; enum mud_state state; } path; + struct mud_path path_status; struct { size_t mtu; int mtu_auto;