Annotation of fwsync/driver/fwsync_mod.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: MALLOC_DEFINE(M_FWSYNC, "fwsync_memory", "FWSync - memory");
        !             9: 
        !            10: static struct ipfw_sopt_handler        soc[] = {
        !            11:        { IP_FW_SYNC_XCONFIG,   0,      HDIR_SET,       fwsync_cfg },
        !            12:        { IP_FW_SYNC_DESTROY,   0,      HDIR_SET,       fwsync_destroy },
        !            13:        { IP_FW_SYNC_XGETCONFIG,        0,      HDIR_GET,       fwsync_get_cfg },
        !            14:        { IP_FW_SYNC_LIST,      0,      HDIR_GET,       fwsync_list },
        !            15:        { IP_FW_SYNC_START,     0,      HDIR_SET,       fwsync_start },
        !            16:        { IP_FW_SYNC_STOP,      0,      HDIR_SET,       fwsync_stop },
        !            17: };
        !            18: 
        !            19: static volatile int fwsync_hooked = 0;
        !            20: struct fwsync_context fws_ctx = { 0 };
        !            21: int fwsync_debug = DRV_DEBUG;
        !            22: static struct sysctl_ctx_list fwsync_sysctl_ctx;
        !            23: struct cfg_sync fws_cfg;
        !            24: //static struct sysctl_oid *fws_sysctl_oid, *fws_sysctl_dir;
        !            25: 
        !            26: struct task fws_sndpkt_task;
        !            27: 
        !            28: SYSCTL_NODE(_net_inet_ip, IFT_FWSYNC, fwsync, CTLFLAG_RW, 0, "IPFW Sync - Sync firewall states");
        !            29: SYSCTL_INT(_net_inet_ip_fwsync, OID_AUTO, debug, CTLFLAG_RW, &fwsync_debug, 0, "Debug driver");
        !            30: 
        !            31: static int
        !            32: fws_fini(void *arg)
        !            33: {
        !            34:        DTRACE();
        !            35: 
        !            36:        if (!fwsync_hooked)
        !            37:                return EBUSY;
        !            38: 
        !            39:        if (fws_cfg.cfg.on || fws_ctx.config) {
        !            40:                uprintf("Unable to unload ELWIX %s driver, cause you have active configuration.\n"
        !            41:                                "Before unload driver flush configuration!\n", DRV_NAME);
        !            42:                return EBUSY;
        !            43:        }
        !            44: 
        !            45:        IPFW_DEL_SOPT_HANDLER(1, soc);
        !            46: 
        !            47:        fwsync_hooked = 0;
        !            48: 
        !            49:        /* sysctl context */
        !            50:        sysctl_ctx_free(&fwsync_sysctl_ctx);
        !            51: 
        !            52:        uprintf("Unloaded ELWIX %s driver version %d ...\n", DRV_NAME, DRV_VERSION);
        !            53:        return 0;
        !            54: }
        !            55: 
        !            56: static int
        !            57: fws_shut(void *arg)
        !            58: {
        !            59:        DTRACE();
        !            60: 
        !            61:        fws_fini(arg);
        !            62: 
        !            63:        return 0;
        !            64: }
        !            65: 
        !            66: static int
        !            67: fws_init(void *arg)
        !            68: {
        !            69:        DTRACE();
        !            70: 
        !            71:        if (fwsync_hooked)
        !            72:                return 0;
        !            73: 
        !            74:        memset(&fws_cfg, 0, sizeof fws_cfg);
        !            75: 
        !            76:        /* sysctl context */
        !            77:        sysctl_ctx_init(&fwsync_sysctl_ctx);
        !            78: 
        !            79:        IPFW_ADD_SOPT_HANDLER(1, soc);
        !            80: 
        !            81:        memset(&fws_ctx, 0, sizeof fws_ctx);
        !            82: 
        !            83:        fwsync_hooked = 1;
        !            84:        uprintf("Loaded ELWIX %s driver version %d ...\n", DRV_NAME, DRV_VERSION);
        !            85:        return 0;
        !            86: }
        !            87: static int
        !            88: fwsync_main(module_t m, int what, void *arg)
        !            89: {
        !            90:        int ret = 0;
        !            91: 
        !            92:        switch (what) {
        !            93:                case MOD_LOAD:
        !            94:                        ret = fws_init(arg);
        !            95:                        break;
        !            96:                case MOD_UNLOAD:
        !            97:                        ret = fws_fini(arg);
        !            98:                        break;
        !            99:                case MOD_SHUTDOWN:
        !           100:                        ret = fws_shut(arg);
        !           101:                        break;
        !           102:                case MOD_QUIESCE:
        !           103:                        /* don't unload driver if there have configured driver */
        !           104:                        if (fws_cfg.cfg.on || fws_ctx.config)
        !           105:                                ret = EBUSY;
        !           106:                        break;
        !           107:                default:
        !           108:                        ret = EINVAL;
        !           109:                        break;
        !           110:        }
        !           111: 
        !           112:        return ret;
        !           113: }
        !           114: 
        !           115: static moduledata_t fwsync_mod = {
        !           116:        "ipfw_sync",
        !           117:        fwsync_main,
        !           118:        NULL
        !           119: };
        !           120: 
        !           121: DECLARE_MODULE(ipfw_sync, fwsync_mod, SI_SUB_PROTO_FIREWALL, SI_ORDER_ANY);
        !           122: MODULE_DEPEND(ipfw_sync, ipfw, 3, 3, 3);
        !           123: MODULE_VERSION(ipfw_sync, DRV_VERSION);
        !           124: 
        !           125: SYSINIT(fws_init, SI_SUB_PROTO_FIREWALL, (SI_ORDER_ANY - 128), fws_init, NULL);
        !           126: SYSUNINIT(fws_fini, SI_SUB_PROTO_FIREWALL, (SI_ORDER_ANY - 128), fws_fini, NULL);

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>