cancel branches scheduled for deletion */
| 65 | |
| 66 | /* cancel branches scheduled for deletion */ |
| 67 | void cancel_uacs( struct cell *t, branch_bm_t cancel_bm ) |
| 68 | { |
| 69 | int i; |
| 70 | |
| 71 | /* cancel pending client transactions, if any */ |
| 72 | for( i=0 ; i<t->nr_of_outgoings ; i++ ) |
| 73 | if ( BRANCH_BM_TST_IDX( cancel_bm, i) ) { |
| 74 | /* any reply actually received on this branch */ |
| 75 | if (TM_BRANCH(t,i).last_received!=0) { |
| 76 | /* send a cancel out */ |
| 77 | cancel_branch(t, i); |
| 78 | } else { |
| 79 | /* if no reply received on this branch, do not send out |
| 80 | * a CANCEL as it is against RFC3261. We will eventually send |
| 81 | * one out IF we receive later a reply on this branch, so let's |
| 82 | * flag it for catching (and cancelling) such delaied replies |
| 83 | */ |
| 84 | TM_BRANCH(t,i).flags |= T_UAC_TO_CANCEL_FLAG; |
| 85 | } |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | |
| 90 | void cancel_branch( struct cell *t, int branch ) |
no test coverage detected