Annotation of fwsync/driver/fwsync_workers.c, revision 1.1
1.1 ! misho 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>