//Initialize the Linux-specific part of the context. All is related to //libmnl/netfilter struct neat_ctx *nt_linux_init_ctx(struct neat_ctx *ctx) { //TODO: Consider allocator function if ((ctx->mnl_rcv_buf = calloc(1, MNL_SOCKET_BUFFER_SIZE)) == NULL) { nt_log(ctx, NEAT_LOG_ERROR, "Failed to allocate netlink buffer", __func__); return NULL; } //Configure netlink and start requesting addresses if ((ctx->mnl_sock = mnl_socket_open(NETLINK_ROUTE)) == NULL) { nt_log(ctx, NEAT_LOG_ERROR, "Failed to allocate netlink socket", __func__); return NULL; } if (mnl_socket_bind(ctx->mnl_sock, (1 << (RTNLGRP_IPV4_IFADDR - 1)) | (1 << (RTNLGRP_IPV6_IFADDR - 1)), 0)) { nt_log(ctx, NEAT_LOG_ERROR, "Failed to bind netlink socket", __func__); return NULL; } //We need to build a list of all available source addresses as soon as //possible. It is started here if (neat_linux_request_addrs(ctx->mnl_sock) <= 0) { nt_log(ctx, NEAT_LOG_ERROR, "Failed to request addresses", __func__); return NULL; } //Add socket to event loop if (uv_udp_init(ctx->loop, &(ctx->uv_nl_handle))) { nt_log(ctx, NEAT_LOG_ERROR, "Failed to initialize uv UDP handle", __func__); return NULL; } //TODO: We could use offsetof, but libuv has a pointer so ... ctx->uv_nl_handle.data = ctx; if (uv_udp_open(&(ctx->uv_nl_handle), mnl_socket_get_fd(ctx->mnl_sock))) { nt_log(ctx, NEAT_LOG_ERROR, "Could not add netlink socket to uv", __func__); return NULL; } if (uv_udp_recv_start(&(ctx->uv_nl_handle), neat_linux_nl_alloc, nt_linux_nl_recv)) { nt_log(ctx, NEAT_LOG_ERROR, "Could not start receiving netlink packets", __func__); return NULL; } ctx->cleanup = nt_linux_cleanup; #ifdef MPTCP_SUPPORT linux_read_sys_mptcp_enabled(ctx); #endif // MPTCP_SUPPORT //Configure netlink socket, add to event loop and start dumping return ctx; }
//Initialize the Linux-specific part of the context. All is related to //libmnl/netfilter struct neat_ctx *neat_linux_init_ctx(struct neat_ctx *nc) { //TODO: Consider allocator function if ((nc->mnl_rcv_buf = calloc(MNL_SOCKET_BUFFER_SIZE, 1)) == NULL) { fprintf(stderr, "Failed to allocate netlink buffer\n"); return NULL; } //Configure netlink and start requesting addresses if ((nc->mnl_sock = mnl_socket_open(NETLINK_ROUTE)) == NULL) { fprintf(stderr, "Failed to allocate netlink socket\n"); return NULL; } if (mnl_socket_bind(nc->mnl_sock, (1 << (RTNLGRP_IPV4_IFADDR - 1)) | (1 << (RTNLGRP_IPV6_IFADDR - 1)), 0)) { fprintf(stderr, "Failed to bind netlink socket\n"); return NULL; } //We need to build a list of all available source addresses as soon as //possible. It is started here if (neat_linux_request_addrs(nc->mnl_sock) <= 0) { fprintf(stderr, "Failed to request addresses\n"); return NULL; } //Add socket to event loop if (uv_udp_init(nc->loop, &(nc->uv_nl_handle))) { fprintf(stderr, "Failed to initialize uv UDP handle\n"); return NULL; } //TODO: We could use offsetof, but libuv has a pointer so ... nc->uv_nl_handle.data = nc; if (uv_udp_open(&(nc->uv_nl_handle), mnl_socket_get_fd(nc->mnl_sock))) { fprintf(stderr, "Could not add netlink socket to uv\n"); return NULL; } if (uv_udp_recv_start(&(nc->uv_nl_handle), neat_linux_nl_alloc, neat_linux_nl_recv)) { fprintf(stderr, "Could not start receiving netlink packets\n"); return NULL; } nc->cleanup = neat_linux_cleanup; //Configure netlink socket, add to event loop and start dumping return nc; }