]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
for non-proxy sockets, run CoA / Disconnect through recv_coa_server
authorAlan T. DeKok <aland@freeradius.org>
Fri, 2 Apr 2021 19:34:55 +0000 (15:34 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 22 Jul 2021 13:55:23 +0000 (09:55 -0400)
which is the CoA server used to send CoA requests to the NAS, but
whatever.  It's copied from the virtual server in the listener,
and is NOT the same as home->virtual_server

src/main/process.c

index 63b2a6d24c97f64eba0c6e3b077fd38f155c9521..31185a94c605c708f233623f5c26da1a56690c3b 100644 (file)
@@ -2545,7 +2545,11 @@ static int process_proxy_reply(REQUEST *request, RADIUS_PACKET *reply)
                request->server = request->home_server->virtual_server;
 
 #ifdef WITH_COA_TUNNEL
-       } else if (request->home_server && request->home_server->recv_coa_server) {
+       } else if (request->proxy_listener && (request->proxy_listener->type != RAD_LISTEN_PROXY)) {
+               rad_assert((request->proxy->code == PW_CODE_COA_REQUEST) ||
+                          (request->proxy->code == PW_CODE_DISCONNECT_REQUEST));
+               rad_assert(request->home_server != NULL);
+               rad_assert(request->home_server->recv_coa_server != NULL);
                request->server = request->home_server->recv_coa_server;
 #endif
 
@@ -3324,6 +3328,15 @@ add_proxy_state:
        if (request->home_server && request->home_server->virtual_server) {
                request->server = request->home_server->virtual_server;
 
+#ifdef WITH_COA_TUNNEL
+       } else if (request->proxy_listener && (request->proxy_listener->type != RAD_LISTEN_PROXY)) {
+               rad_assert((request->packet->code == PW_CODE_COA_REQUEST) ||
+                          (request->packet->code == PW_CODE_DISCONNECT_REQUEST));
+               rad_assert(request->home_server != NULL);
+               rad_assert(request->home_server->recv_coa_server != NULL);
+               request->server = request->home_server->recv_coa_server;
+#endif
+
        } else {
                char buffer[128];
 
@@ -4497,6 +4510,15 @@ set_packet_type:
        if (coa->home_server && coa->home_server->virtual_server) {
                coa->server = coa->home_server->virtual_server;
 
+#ifdef WITH_COA_TUNNEL
+       } else if (coa->proxy_listener && (coa->proxy_listener->type != RAD_LISTEN_PROXY)) {
+               rad_assert((coa->proxy->code == PW_CODE_COA_REQUEST) ||
+                          (coa->proxy->code == PW_CODE_DISCONNECT_REQUEST));
+               rad_assert(coa->home_server != NULL);
+               rad_assert(coa->home_server->recv_coa_server != NULL);
+               coa->server = coa->home_server->recv_coa_server;
+#endif
+
        } else if (coa->home_pool && coa->home_pool->virtual_server) {
                coa->server = coa->home_pool->virtual_server;
        }