]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add mod_release and mod_mark
authorNick Porter <nick@portercomputing.co.uk>
Mon, 17 Aug 2020 15:01:13 +0000 (16:01 +0100)
committerAlan DeKok <aland@freeradius.org>
Wed, 9 Sep 2020 12:45:16 +0000 (08:45 -0400)
src/modules/rlm_sqlippool/rlm_sqlippool.c

index a4989c6c84c4a6e6f390ed16cab02bee55596600..bdaf814821e26c5ccd2112bdac9253bec4694a90 100644 (file)
@@ -664,6 +664,67 @@ static rlm_rcode_t CC_HINT(nonnull) mod_extend(module_ctx_t const *mctx, REQUEST
        }
 }
 
+/*
+ *     Release a lease.
+ */
+static rlm_rcode_t CC_HINT(nonnull) mod_release(module_ctx_t const *mctx, REQUEST *request)
+{
+       rlm_sqlippool_t         *inst = talloc_get_type_abort(mctx->instance, rlm_sqlippool_t);
+       rlm_sql_handle_t        *handle;
+
+       handle = fr_pool_connection_get(inst->sql_inst->pool, request);
+       if (!handle) {
+               REDEBUG("Failed reserving SQL connection");
+               return RLM_MODULE_FAIL;
+       }
+
+       if (inst->sql_inst->sql_set_user(inst->sql_inst, request, NULL) < 0) {
+               return RLM_MODULE_FAIL;
+       }
+
+       DO_PART(release_begin);
+       DO_PART(release_clear);
+       DO_PART(release_commit);
+
+       if (handle) fr_pool_connection_release(inst->sql_inst->pool, request, handle);
+       return RLM_MODULE_OK;
+
+       error:
+       if (handle) fr_pool_connection_release(inst->sql_inst->pool, request, handle);
+       return RLM_MODULE_FAIL;
+}
+
+/*
+ *     Mark a lease.  Typically for DHCP Decline where IPs need to be marked
+ *     as invalid
+ */
+static rlm_rcode_t CC_HINT(nonnull) mod_mark(module_ctx_t const *mctx, REQUEST *request)
+{
+       rlm_sqlippool_t         *inst = talloc_get_type_abort(mctx->instance, rlm_sqlippool_t);
+       rlm_sql_handle_t        *handle;
+
+       handle = fr_pool_connection_get(inst->sql_inst->pool, request);
+       if (!handle) {
+               REDEBUG("Failed reserving SQL connection");
+               return RLM_MODULE_FAIL;
+       }
+
+       if (inst->sql_inst->sql_set_user(inst->sql_inst, request, NULL) < 0) {
+               return RLM_MODULE_FAIL;
+       }
+
+       DO_PART(mark_begin);
+       DO_PART(mark_update);
+       DO_PART(mark_commit);
+
+       if (handle) fr_pool_connection_release(inst->sql_inst->pool, request, handle);
+       return RLM_MODULE_OK;
+
+       error:
+       if (handle) fr_pool_connection_release(inst->sql_inst->pool, request, handle);
+       return RLM_MODULE_FAIL;
+}
+
 static int mod_accounting_start(rlm_sql_handle_t **handle,
                                rlm_sqlippool_t const *inst, REQUEST *request)
 {
@@ -805,8 +866,8 @@ module_t rlm_sqlippool = {
        .method_names = (module_method_names_t[]){
                { "recv",       "DHCP-Discover",        mod_allocate },
                { "recv",       "DHCP-Request",         mod_extend },
-//             { "recv",       "DHCP-Release",         mod_release },
-//             { "recv",       "DHCP-Decline",         mod_mark },
+               { "recv",       "DHCP-Release",         mod_release },
+               { "recv",       "DHCP-Decline",         mod_mark },
 
                MODULE_NAME_TERMINATOR
        }