# define COA_SEPARATE
#endif
-#define CHECK_FOR_STOP do { if (request->master_state == REQUEST_STOP_PROCESSING) {request_done(request, FR_ACTION_DONE);return;}} while (0)
+#define CHECK_FOR_STOP do { if (request->master_state == REQUEST_STOP_PROCESSING) {request_done(request, FR_ACTION_CANCELLED);return;}} while (0)
#undef USEC
#define USEC (1000000)
*
* \dot
* digraph done {
+ * stopped -> done
* done -> done [ label = "still running" ];
* }
* \enddot
}
#endif
-#ifdef WITH_COA
/*
- * Move the CoA request to its own handler.
+ * If it was administratively canceled, then it's done.
*/
- if (request->coa) {
- coa_separate(request->coa, true);
- } else if (request->parent && (request->parent->coa == request)) {
- coa_separate(request, true);
+ if (action == FR_ACTION_CANCELLED) {
+ action = FR_ACTION_DONE;
+ }
+#ifdef WITH_COA
+ else {
+ /*
+ * Move the CoA request to its own handler, but
+ * only if the request finished normally, and was
+ * not administatively canceled.
+ */
+ if (request->coa) {
+ coa_separate(request->coa, true);
+ } else if (request->parent && (request->parent->coa == request)) {
+ coa_separate(request, true);
+ }
}
#endif
*/
if (request->child_state == REQUEST_DONE) {
done:
- request_done(request, FR_ACTION_DONE);
+ request_done(request, FR_ACTION_CANCELLED);
return true;
}
child_state_names[request->child_state],
child_state_names[REQUEST_DONE]);
#endif
- request_done(request, FR_ACTION_DONE);
+ request_done(request, FR_ACTION_CANCELLED);
return;
}
* Otherwise we're not going to do anything with
* it...
*/
- request_done(request, FR_ACTION_DONE);
+ request_done(request, FR_ACTION_CANCELLED);
return;
}
#endif
* the request just as we're logging the
* complaint.
*/
- request_done(request, FR_ACTION_DONE);
+ request_done(request, FR_ACTION_CANCELLED);
request = NULL;
/*
if (!listener->nodup) {
if (!rbtree_insert(pl, &request->packet)) {
RERROR("Failed to insert request in the list of live requests: discarding it");
- request_done(request, FR_ACTION_DONE);
+ request_done(request, FR_ACTION_CANCELLED);
return 1;
}
* Once we've decided to proxy a request, we cannot send
* a CoA packet. So we free up any CoA packet here.
*/
- if (request->coa) request_done(request->coa, FR_ACTION_DONE);
+ if (request->coa) request_done(request->coa, FR_ACTION_CANCELLED);
#endif
/*
#ifdef WITH_COA
if (request->coa) {
RWDEBUG("Cannot proxy and originate CoA packets at the same time. Cancelling CoA request");
- request_done(request->coa, FR_ACTION_DONE);
+ request_done(request->coa, FR_ACTION_CANCELLED);
}
#endif
*/
if (request->child_state == REQUEST_DONE) {
done:
- request_done(request, FR_ACTION_DONE);
+ request_done(request, FR_ACTION_CANCELLED);
return true;
}
request->proxy_reply ||
!request->proxy_listener ||
(request->proxy_listener->status >= RAD_LISTEN_STATUS_EOL)) {
- request_done(request, FR_ACTION_DONE);
+ request_done(request, FR_ACTION_CANCELLED);
break;
}
request->in_proxy_hash = false;
if (!request->in_request_hash) {
- request_done(request, FR_ACTION_DONE);
+ request_done(request, FR_ACTION_CANCELLED);
}
/*