return contdata;
}
+int fwp_contract_destroy(fwp_contract_d_t contractd)
+{
+ fwp_contract_data_t *contdata = contractd;
+
+ if (contdata->status != FWP_CONT_NOTNEGOTIATED)
+ return -EPERM;
+ fwp_contract_data_delete(contdata);
+ return 0;
+}
+
int fwp_contract_reserve(fwp_contract_d_t contractd)
{
fwp_contract_data_t *contdata = contractd;
fwp_contract_data_t *contdata = contractd;
fwp_msgb_t *msgb;
- /* Send COMMIT to manager */
+ if (contdata->status != FWP_CONT_NEGOTIATED)
+ return -EPERM;
+
+ /* Send CANCEL to manager */
msgb = fwp_msgb_alloc(sizeof(struct fwp_msg_header) +
sizeof(struct fwp_msg_contracthdr));
fwp_msgb_reserve(msgb, sizeof(struct fwp_msg_header));
typedef struct fwp_contract_data* fwp_contract_d_t;
fwp_contract_d_t fwp_contract_create(fwp_contract_t *contract);
-int fwp_contract_negotiate(fwp_contract_d_t contract, fwp_vres_d_t *vresdp);
+int fwp_contract_destroy(fwp_contract_d_t contractd);
+int fwp_contract_negotiate(fwp_contract_d_t contract, fwp_vres_d_t *vresdp);
+int fwp_contract_cancel(fwp_contract_d_t contractd);
int fwp_contract_is_negotiated(fwp_contract_d_t contract);
int fwp_contract_cancel(fwp_contract_d_t contractd);
sizeof(fwp_contract_data_t));
}
+static inline void fwp_contract_data_delete(fwp_contract_data_t* contdata)
+{
+ free(contdata);
+}
+
int fwp_contract_reserve(fwp_contract_d_t contractd);
int fwp_contract_commit(fwp_contract_d_t contractd, fwp_vres_d_t *vresdp);
+/* TODO: Implement fwp_contract_set_state function
+ * int fwp_contract_set_state(fwp_contract_state_t state)
+ * */
+
#endif /*_FWP_INTERNALS_ */
#endif /*_FWP_CONTRACT_H */
return 0;
}
+int
+fwp_mngr_contract_cancel(fwp_msgb_t *msgb, fwp_participant_id_t participant_id)
+{
+ fwp_participant_t *participant;
+ fwp_contract_data_t *contdata;
+ fwp_contract_id_t id;
+ fwp_contract_status_t status;
+
+ /* Find participant */
+ if (!(participant = fwp_participant_table_find(&participant_id))){
+ return -EPERM;
+ }
+
+ fwp_msg_contracthdr_out(msgb->data, &id, &status);
+ fwp_msgb_pull(msgb, sizeof(struct fwp_msg_contracthdr));
+
+ contdata = fwp_contract_table_find(&participant->contract_table, id);
+ contdata->status = FWP_CONT_NOTNEGOTIATED;
+ /* release vres */
+ fwp_vres_destroy(contdata->vresd);
+ /* delete contract from contract table */
+ fwp_contract_table_delete(&participant->contract_table, contdata);
+ fwp_contract_destroy(contdata);
+
+ FWP_DEBUG("Contract id=%d to canceled\n", id);
+
+ return 0;
+}
+
void fwp_mngr_msg_handler(fwp_msgb_t *msgb)
{
fwp_msg_type_t msg_type;
participant_id.app_id);
fwp_mngr_contract_commit(msgb, participant_id);
break;
+
+ case FWP_MSG_CANCEL:
+ FWP_DEBUG("Message CANCEL received from nodeid = %d "
+ "appid = %d\n", participant_id.node_id,
+ participant_id.app_id);
+ fwp_mngr_contract_cancel(msgb, participant_id);
+ break;
+
default:
printf("Invalid message\n.");
fwp_msgb_free(msgb);