/************************************************************************* * (C) 2022 CloudSigma AG - Sofia/Bulgaria * by Michael Pounov **************************************************************************/ #include "fwsync.h" static void fwsync_sndpkt(void *context, int pending) { struct mbuf *m2, *m = (struct mbuf*) context; int e; DTRACE(); if (fws_cfg.cfg.on & CFG_SYNC_COLLECTOR) { if ((fws_ctx.config & (CTX_COLLECTOR_2_ONLINE | CTX_COLLECTOR_2_READY)) == (CTX_COLLECTOR_2_ONLINE | CTX_COLLECTOR_2_READY)) { m2 = m_copypacket(m, M_NOWAIT); if (!m2) { printf("error in copypacket for second collector\n"); goto out; } e = sosend(fws_ctx.sockz[CFG_SYNC_ADDR_COLLECTOR_2], &fws_cfg.cfg_addr[CFG_SYNC_ADDR_COLLECTOR_2].addr, NULL, m2, NULL, 0, curthread); if (e != EAGAIN) printf("error in collector %d handler #%d\n", CFG_SYNC_ADDR_COLLECTOR_2, e); } if ((fws_ctx.config & (CTX_COLLECTOR_1_ONLINE | CTX_COLLECTOR_1_READY)) == (CTX_COLLECTOR_1_ONLINE | CTX_COLLECTOR_1_READY)) { m2 = m_copypacket(m, M_NOWAIT); if (!m2) { printf("error in copypacket for first collector\n"); goto out; } e = sosend(fws_ctx.sockz[CFG_SYNC_ADDR_COLLECTOR_1], &fws_cfg.cfg_addr[CFG_SYNC_ADDR_COLLECTOR_1].addr, NULL, m2, NULL, 0, curthread); if (e != EAGAIN) printf("error in collector %d handler #%d\n", CFG_SYNC_ADDR_COLLECTOR_1, e); } } out: m_freem(m); } int fwsync_state_handler(const void *arg) { const struct ipfw_flow_id *pkt = arg; struct fws_proto *spkt; struct mbuf *m; DTRACE(); if (pkt->addr_type == 1) return 0; /* skip ethernet packet */ m = m_gethdr(M_WAITOK, MT_DATA); if (!m) return ENOMEM; else { spkt = mtod(m, struct fws_proto *); m->m_len = sizeof(struct fws_proto); m_fixhdr(m); } spkt->fws_version = FWS_PKTVER_STATE; spkt->fws_fib = pkt->fib; spkt->fws_proto = pkt->proto; spkt->fws_addrtype = pkt->addr_type; spkt->fws_sport = pkt->src_port; spkt->fws_dport = pkt->dst_port; switch (pkt->addr_type) { case 4: spkt->fws_saddr.s_addr = pkt->src_ip; spkt->fws_daddr.s_addr = pkt->dst_ip; spkt->fws_scopeid = 0; break; case 6: memcpy(&spkt->fws_saddr6, &pkt->src_ip6, sizeof spkt->fws_saddr6); memcpy(&spkt->fws_daddr6, &pkt->dst_ip6, sizeof spkt->fws_daddr6); spkt->fws_scopeid = pkt->flow_id6; break; default: m_free(m); return 0; } TASK_INIT(&fws_sndpkt_task, 0, fwsync_sndpkt, m); taskqueue_enqueue(taskqueue_thread, &fws_sndpkt_task); return 0; } int fwsync_alias_handler(const void *arg) { DTRACE(); return 0; }