Example #1
0
//++++++++++++++++++++++++++++++++++++++++++++++++
//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;
}
Example #2
0
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));
}
Example #3
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));
}
Example #4
0
//++++++++++++++++++++++++++++++++++++++++++++++++
//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;
}