1: /*************************************************************************
2: * (C) 2022 CloudSigma AG - Sofia/Bulgaria
3: * by Michael Pounov <misho@elwix.org>
4: **************************************************************************/
5: #include "fwsync.h"
6:
7:
8: static void
9: fwsync_sndpkt(void *context, int pending)
10: {
11: struct mbuf *m2, *m = (struct mbuf*) context;
12: int e;
13:
14: DTRACE();
15:
16: if (fws_cfg.cfg.on & CFG_SYNC_COLLECTOR) {
17: if ((fws_ctx.config & (CTX_COLLECTOR_2_ONLINE | CTX_COLLECTOR_2_READY)) ==
18: (CTX_COLLECTOR_2_ONLINE | CTX_COLLECTOR_2_READY)) {
19: m2 = m_copypacket(m, M_NOWAIT);
20: if (!m2) {
21: printf("error in copypacket for second collector\n");
22: goto out;
23: }
24: e = sosend(fws_ctx.sockz[CFG_SYNC_ADDR_COLLECTOR_2],
25: &fws_cfg.cfg_addr[CFG_SYNC_ADDR_COLLECTOR_2].addr, NULL,
26: m2, NULL, 0, curthread);
27: if (e != EAGAIN)
28: printf("error in collector %d handler #%d\n", CFG_SYNC_ADDR_COLLECTOR_2, e);
29: }
30:
31: if ((fws_ctx.config & (CTX_COLLECTOR_1_ONLINE | CTX_COLLECTOR_1_READY)) ==
32: (CTX_COLLECTOR_1_ONLINE | CTX_COLLECTOR_1_READY)) {
33: m2 = m_copypacket(m, M_NOWAIT);
34: if (!m2) {
35: printf("error in copypacket for first collector\n");
36: goto out;
37: }
38: e = sosend(fws_ctx.sockz[CFG_SYNC_ADDR_COLLECTOR_1],
39: &fws_cfg.cfg_addr[CFG_SYNC_ADDR_COLLECTOR_1].addr, NULL,
40: m2, NULL, 0, curthread);
41: if (e != EAGAIN)
42: printf("error in collector %d handler #%d\n", CFG_SYNC_ADDR_COLLECTOR_1, e);
43: }
44: }
45: out:
46: m_freem(m);
47:
48: }
49:
50: int
51: fwsync_state_handler(const void *arg)
52: {
53: const struct ipfw_flow_id *pkt = arg;
54: struct fws_proto *spkt;
55: struct mbuf *m;
56:
57: DTRACE();
58:
59: if (pkt->addr_type == 1)
60: return 0; /* skip ethernet packet */
61:
62: m = m_gethdr(M_WAITOK, MT_DATA);
63: if (!m)
64: return ENOMEM;
65: else {
66: spkt = mtod(m, struct fws_proto *);
67: m->m_len = sizeof(struct fws_proto);
68: m_fixhdr(m);
69: }
70:
71: spkt->fws_version = FWS_PKTVER_STATE;
72: spkt->fws_fib = pkt->fib;
73: spkt->fws_proto = pkt->proto;
74: spkt->fws_addrtype = pkt->addr_type;
75: spkt->fws_sport = pkt->src_port;
76: spkt->fws_dport = pkt->dst_port;
77:
78: switch (pkt->addr_type) {
79: case 4:
80: spkt->fws_saddr.s_addr = pkt->src_ip;
81: spkt->fws_daddr.s_addr = pkt->dst_ip;
82: spkt->fws_scopeid = 0;
83: break;
84: case 6:
85: memcpy(&spkt->fws_saddr6, &pkt->src_ip6, sizeof spkt->fws_saddr6);
86: memcpy(&spkt->fws_daddr6, &pkt->dst_ip6, sizeof spkt->fws_daddr6);
87: spkt->fws_scopeid = pkt->flow_id6;
88: break;
89: default:
90: m_free(m);
91: return 0;
92: }
93:
94: TASK_INIT(&fws_sndpkt_task, 0, fwsync_sndpkt, m);
95: taskqueue_enqueue(taskqueue_thread, &fws_sndpkt_task);
96: return 0;
97: }
98:
99: int
100: fwsync_alias_handler(const void *arg)
101: {
102: DTRACE();
103:
104: return 0;
105: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>