struct glob {
int server_sock;
int sock;
+ bool reflect;
};
struct glob glob_space;
cur = buf;
end = buf + buf_len;
- cur += snprintf(cur, end - cur, "%s %s/%d, Prot: %s",
+ cur += snprintf(cur, end - cur, "%s %s/%d, Prot: %s(%u)",
netlink_msg_type_to_s(hdr->nlmsg_type),
addr_to_s(rtmsg->rtm_family, RTA_DATA(ctx->dest)),
rtmsg->rtm_dst_len,
- netlink_prot_to_s(rtmsg->rtm_protocol));
+ netlink_prot_to_s(rtmsg->rtm_protocol),
+ rtmsg->rtm_protocol);
if (ctx->metric)
cur += snprintf(cur, end - cur, ", Metric: %d", *ctx->metric);
/*
* parse_netlink_msg
*/
-static void
-parse_netlink_msg(char *buf, size_t buf_len)
+static void parse_netlink_msg(char *buf, size_t buf_len, fpm_msg_hdr_t *fpm)
{
struct netlink_msg_ctx ctx_space, *ctx;
struct nlmsghdr *hdr;
}
print_netlink_msg_ctx(ctx);
+
+ if (glob->reflect && hdr->nlmsg_type == RTM_NEWROUTE &&
+ ctx->rtmsg->rtm_protocol > RTPROT_STATIC) {
+ printf(" Route %s(%u) reflecting back\n",
+ netlink_prot_to_s(
+ ctx->rtmsg->rtm_protocol),
+ ctx->rtmsg->rtm_protocol);
+ ctx->rtmsg->rtm_flags |= RTM_F_OFFLOAD;
+ write(glob->sock, fpm, fpm_msg_len(fpm));
+ }
break;
default:
return;
}
- parse_netlink_msg(fpm_msg_data(hdr), fpm_msg_data_len(hdr));
+ parse_netlink_msg(fpm_msg_data(hdr), fpm_msg_data_len(hdr), hdr);
}
/*
int main(int argc, char **argv)
{
pid_t daemon;
- int d;
+ int r;
+ bool fork_daemon = false;
+
+ memset(glob, 0, sizeof(*glob));
- d = getopt(argc, argv, "d");
- if (d == 'd') {
+ while ((r = getopt(argc, argv, "rd")) != -1) {
+ switch (r) {
+ case 'r':
+ glob->reflect = true;
+ break;
+ case 'd':
+ fork_daemon = true;
+ break;
+ }
+ }
+
+ if (fork_daemon) {
daemon = fork();
if (daemon)
exit(0);
}
- memset(glob, 0, sizeof(*glob));
-
if (!create_listen_sock(FPM_DEFAULT_PORT, &glob->server_sock))
exit(1);