//++++++++++++++++++++++++++++++++++++++++++++++++ //CONMAN: do_add(struct session *sess) //++++++++++++++++++++++++++++++++++++++++++++++++ int add_sfl_fifo(struct session *sess) { if(cmcmd.cmd != 'A') return 0; sess->conman_state = 'A'; struct fourtuple ft; if(!determine_fourtuple(sess, &ft)){ sprintf(msg_buf,"add_sfl_fifo: new subflow cannot be created - FIFO CMD ABORTED"); add_msg(msg_buf); return 0; } if(UPDATE_DEFAULT_ROUTE) update_default_route(ft.ip_loc); unsigned char backup = 1; if(ALLOW_PEER_MULTIPATH) backup = 0; if(initiate_cand_subflow(sess, &ft, backup) == 0){ sprintf(msg_buf,"add_sfl_fifo: initiate_cand_subflow() creates error - FIFO CMD ABORTED"); add_msg(msg_buf); return 0; } sprintf(msg_buf,"add_sfl_fifo: new subflow initiated"); add_msg(msg_buf); return 1; }
boolean_t del_default_route(uint32_t ifindex, struct in_addr *gateway_nbo) { if (gateway_nbo->s_addr == htonl(INADDR_ANY)) /* no router */ return (B_TRUE); return (update_default_route(ifindex, RTM_DELETE, gateway_nbo, 0)); }
boolean_t add_default_route(uint32_t ifindex, struct in_addr *gateway_nbo) { return (update_default_route(ifindex, RTM_ADD, gateway_nbo, RTF_UP)); }
//++++++++++++++++++++++++++++++++++++++++++++++++ //CONMAN: do_break(struct session *sess) //++++++++++++++++++++++++++++++++++++++++++++++++ int break_sfl_fifo(struct session *sess) { //present active subflow will be interrupted //if candidate is up, it becomes active subflow //if no candidate exists but loc IP address is provided, a new subflow is created //if no candidate and no new local IP address but USE_PORT_FOR_NEW_SUBFLOWS, new port on existing loc IP is used //otherwise nothing happpens //break event is set whenever a new subflow has to be created //find candidate subflow struct subflow *new_sfl = NULL; new_sfl = find_subflow_in_session(sess, (cmcmd.sfl>-1), (size_t) cmcmd.sfl, 1); //if new_sfl == NULL try to create new subflow if(new_sfl == NULL) { sprintf(msg_buf, "break_sfl_fifo: candidate subflow not found -> creating new subflow"); add_msg(msg_buf); //get fourtuple for new subflow (all except active) //note: act_subflow != NULL at this point cmcmd.ip_loc = 0; cmcmd.prt_loc = 0; cmcmd.ip_rem = 0; cmcmd.prt_rem = 0; struct fourtuple ft; if(!determine_fourtuple(sess, &ft)) { sprintf(msg_buf,"break_sfl_fifo: new subflow cannot be created - FIFO CMD ABORTED"); add_msg(msg_buf); return 0; } if(UPDATE_DEFAULT_ROUTE) update_default_route(ft.ip_loc); //set last subflow to active subflow sess->act_subflow->broken = 1; sess->cdsn_loc = sess->highest_dan_loc-1; unsigned char backup = 0; if(initiate_cand_subflow(sess, &ft, backup) == 0){ sprintf(msg_buf,"break_sfl_fifo: initiating new subflow creates error - FIFO CMD ABORTED"); add_msg(msg_buf); return 0; } } else { sprintf(msg_buf,"break_sfl_fifo: sess id=%zu - deleting old sfl id=%zu and using new sfl id=%zu", sess->index, sess->act_subflow->index, new_sfl->index); add_msg(msg_buf); break_active_sfl(sess, new_sfl);//switches to new subflow in "break" manner //send break ack: TPprio for new subflow and REMOVE_ADDR on old address send_break_ack(sess->act_subflow, sess->last_subflow->addr_id_loc); if(sess->act_subflow->addr_id_loc == sess->last_subflow->addr_id_loc) send_reset_subflow(sess->last_subflow); create_prio_event(&sess->ft, sess->last_subflow->addr_id_loc);//to resend breal ack return 1; } return 1; }