]> 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>
Fri, 2 Apr 2021 19:41:14 +0000 (15:41 -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 193e2e8babd093848e24d661dbd57c2d95b90d35..0cd6cdb919c3041443fc59c737dc2b46343a14a2 100644 (file)
@@ -2540,7 +2540,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
 
@@ -3319,6 +3323,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];
 
@@ -4482,6 +4495,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;
        }