message / peer FSM: fix completion detection + timeout logic

* when the message_peer FSM times out, we msut notify the message_fsm
* when waiting for DELETE_ACK, require all message_peer FSM instances to
  enter DELETE state before signaling completion

Change-Id: Ibff5e25ebb34843c4b3165329f432892ac6a6ef5
This commit is contained in:
Harald Welte 2021-01-03 14:09:19 +01:00
parent d800ab2743
commit fbc3015c02
2 changed files with 9 additions and 5 deletions

View File

@ -66,7 +66,7 @@ static void smscb_fsm_wait_write_ack(struct osmo_fsm_inst *fi, uint32_t event, v
* timed out */
llist_for_each_entry(peer_fi, &fi->proc.children, proc.child) {
if (peer_fi->state == SMSCB_S_WAIT_WRITE_ACK)
break;
return;
}
rest_it_op_set_http_result(cbcmsg->it_op, 201, "Created"); // FIXME: error cases
osmo_fsm_inst_state_chg(fi, SMSCB_S_ACTIVE, 0, 0);
@ -125,7 +125,7 @@ static void smscb_fsm_wait_replace_ack(struct osmo_fsm_inst *fi, uint32_t event,
case SMSCB_E_CBSP_REPLACE_NACK:
llist_for_each_entry(peer_fi, &fi->proc.children, proc.child) {
if (peer_fi->state == SMSCB_S_WAIT_REPLACE_ACK)
break;
return;
}
rest_it_op_set_http_result(cbcmsg->it_op, 200, "OK"); // FIXME: error cases
osmo_fsm_inst_state_chg(fi, SMSCB_S_ACTIVE, 0, 0);
@ -153,7 +153,7 @@ static void smscb_fsm_wait_status_ack(struct osmo_fsm_inst *fi, uint32_t event,
case SMSCB_E_CBSP_STATUS_NACK:
llist_for_each_entry(peer_fi, &fi->proc.children, proc.child) {
if (peer_fi->state == SMSCB_S_WAIT_STATUS_ACK)
break;
return;
}
rest_it_op_set_http_result(cbcmsg->it_op, 200, "OK"); // FIXME: error cases
osmo_fsm_inst_state_chg(fi, SMSCB_S_ACTIVE, 0, 0);
@ -180,8 +180,8 @@ static void smscb_fsm_wait_delete_ack(struct osmo_fsm_inst *fi, uint32_t event,
case SMSCB_E_CBSP_DELETE_ACK:
case SMSCB_E_CBSP_DELETE_NACK:
llist_for_each_entry(peer_fi, &fi->proc.children, proc.child) {
if (peer_fi->state == SMSCB_S_WAIT_DELETE_ACK)
break;
if (peer_fi->state != SMSCB_S_DELETED)
return;
}
rest_it_op_set_http_result(cbcmsg->it_op, 200, "OK"); // FIXME: error cases
osmo_fsm_inst_state_chg(fi, SMSCB_S_DELETED, 0, 0);

View File

@ -434,15 +434,19 @@ static int smscb_p_fsm_timer_cb(struct osmo_fsm_inst *fi)
switch (fi->T) {
case T_WAIT_WRITE_ACK:
osmo_fsm_inst_state_chg(fi, SMSCB_S_ACTIVE, 0, 0);
osmo_fsm_inst_dispatch(fi->proc.parent, SMSCB_E_CBSP_WRITE_NACK, NULL);
break;
case T_WAIT_REPLACE_ACK:
osmo_fsm_inst_state_chg(fi, SMSCB_S_ACTIVE, 0, 0);
osmo_fsm_inst_dispatch(fi->proc.parent, SMSCB_E_CBSP_REPLACE_NACK, NULL);
break;
case T_WAIT_STATUS_ACK:
osmo_fsm_inst_state_chg(fi, SMSCB_S_ACTIVE, 0, 0);
osmo_fsm_inst_dispatch(fi->proc.parent, SMSCB_E_CBSP_STATUS_NACK, NULL);
break;
case T_WAIT_DELETE_ACK:
osmo_fsm_inst_state_chg(fi, SMSCB_S_DELETED, 0, 0);
osmo_fsm_inst_dispatch(fi->proc.parent, SMSCB_E_CBSP_DELETE_NACK, NULL);
break;
default:
OSMO_ASSERT(0);