예제 #1
0
/* Action group init and destroy */
of1x_action_group_t* of1x_init_action_group(of1x_packet_action_t* actions){

	unsigned int number_of_actions=0, number_of_output_actions=0;
	of1x_action_group_t* action_group;
	
	action_group = platform_malloc_shared(sizeof(of1x_action_group_t));

	if( unlikely(action_group==NULL) )
		return NULL;
	
	if(actions){
		action_group->head = actions;
	
		for(;actions;actions=actions->next, number_of_actions++){

			if(actions->type == OF1X_AT_OUTPUT /*|| actions->type == OF1X_AT_GROUP*/)
				number_of_output_actions++;

			if(!actions->next){
				action_group->tail = actions;
				break;
			}	
		}
	}else{
		action_group->head = NULL;
		action_group->tail = NULL;
	}

	action_group->num_of_actions = number_of_actions;
	action_group->num_of_output_actions = number_of_output_actions;

	//Fast validation, set min max 
	action_group->ver_req.min_ver = OF1X_MIN_VERSION;
	action_group->ver_req.max_ver = OF1X_MAX_VERSION;
	bitmap128_clean(&action_group->bitmap);

	return action_group;
}
예제 #2
0
of1x_write_actions_t* of1x_init_write_actions(){

	int i;
	of1x_write_actions_t* write_actions = platform_malloc_shared(sizeof(of1x_write_actions_t)); 

	if( unlikely(write_actions==NULL) )
		return NULL;

	//Clean actions bitmap
	bitmap128_clean(&write_actions->bitmap);

	for(i=0;i<OF1X_AT_NUMBER;i++)
		write_actions->actions[i].type = (of1x_packet_action_type_t)i;	
	
	//num of actions and output actions
	write_actions->num_of_actions = 0;
	write_actions->num_of_output_actions = 0;

	//Fast validation, set min max 
	write_actions->ver_req.min_ver = OF1X_MIN_VERSION;
	write_actions->ver_req.max_ver = OF1X_MAX_VERSION;

	return write_actions;
}
예제 #3
0
void __of10_set_table_defaults(of1x_flow_table_t* table){

	//Set default behaviour MISS Controller	
	//XXX: Original of10 was not not handling more than one table, why does
	//the spec now have it? 
	table->default_action = OF1X_TABLE_MISS_CONTROLLER;
	
	/* Setting up basic characteristics of the table */
	table->config.table_miss_config = 0x0; //No meaning in OF1.0

	//Match
	bitmap128_clean(&table->config.match);
	bitmap128_set(&table->config.match, OF1X_MATCH_IN_PORT);
	bitmap128_set(&table->config.match, OF1X_MATCH_ETH_DST);
	bitmap128_set(&table->config.match, OF1X_MATCH_ETH_SRC);
	bitmap128_set(&table->config.match, OF1X_MATCH_ETH_TYPE);
	bitmap128_set(&table->config.match, OF1X_MATCH_VLAN_VID);
	bitmap128_set(&table->config.match, OF1X_MATCH_VLAN_PCP);
	bitmap128_set(&table->config.match, OF1X_MATCH_IP_DSCP);
	bitmap128_set(&table->config.match, OF1X_MATCH_NW_PROTO);
	bitmap128_set(&table->config.match, OF1X_MATCH_NW_SRC);
	bitmap128_set(&table->config.match, OF1X_MATCH_NW_DST);
	bitmap128_set(&table->config.match, OF1X_MATCH_TP_SRC); //Only for OF10
	bitmap128_set(&table->config.match, OF1X_MATCH_TP_DST); //Only for OF10
	bitmap128_set(&table->config.match, OF1X_MATCH_PPPOE_CODE);
	bitmap128_set(&table->config.match, OF1X_MATCH_PPPOE_TYPE);
	bitmap128_set(&table->config.match, OF1X_MATCH_PPPOE_SID);
	bitmap128_set(&table->config.match, OF1X_MATCH_PPP_PROT);
	bitmap128_set(&table->config.match, OF1X_MATCH_GTP_MSG_TYPE);
	bitmap128_set(&table->config.match, OF1X_MATCH_GTP_TEID);

	//Wildcards
	bitmap128_clean(&table->config.wildcards);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_ETH_DST);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_ETH_SRC);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_NW_SRC);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_NW_DST);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_MPLS_LABEL);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_GTP_TEID);

	//Apply actions
	bitmap128_clean(&table->config.apply_actions);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_ETH_DST);
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_COPY_TTL_IN
	bitmap128_set(&table->config.apply_actions, OF1X_AT_POP_VLAN);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_POP_PPPOE);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_PUSH_PPPOE);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_PUSH_VLAN);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_DEC_NW_TTL);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_NW_TTL);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_QUEUE);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ETH_DST);  		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ETH_SRC);  		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ETH_TYPE); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_VLAN_VID); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_VLAN_PCP); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_NW_PROTO);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_NW_SRC);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_NW_DST);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IP_DSCP);  		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IP_ECN);   		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IP_PROTO); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV4_SRC); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV4_DST); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_TP_SRC);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_TP_DST);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_PPPOE_CODE);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_PPPOE_TYPE);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_PPPOE_SID);	   	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_PPP_PROT); 	   	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_GTP_MSG_TYPE);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_GTP_TEID);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_OUTPUT);
	
	//Write actions	
	bitmap128_clean(&table->config.write_actions); //Not supported in OF10 

	//METADATA
	table->config.metadata_match = 0x0; //Not supported in OF10
	table->config.metadata_write = 0x0; //Not supported in OF10

	//Instructions
	table->config.instructions = 0x0; //Not supported in OF10 

}
예제 #4
0
void __of12_set_table_defaults(of1x_flow_table_t* table){

	//Set default behaviour MISS Controller	
	table->default_action = OF1X_TABLE_MISS_CONTROLLER;
	
	/* Setting up basic characteristics of the table */
	table->config.table_miss_config = (1 << OF1X_TABLE_MISS_CONTROLLER) | (1 << OF1X_TABLE_MISS_CONTINUE) | (1 << OF1X_TABLE_MISS_DROP);

	//Match
	bitmap128_clean(&table->config.match);
	bitmap128_set(&table->config.match, OF1X_MATCH_IN_PORT);
	bitmap128_set(&table->config.match, OF1X_MATCH_IN_PHY_PORT);
	bitmap128_set(&table->config.match, OF1X_MATCH_METADATA);
	bitmap128_set(&table->config.match, OF1X_MATCH_ETH_DST);
	bitmap128_set(&table->config.match, OF1X_MATCH_ETH_SRC);
	bitmap128_set(&table->config.match, OF1X_MATCH_ETH_TYPE);
	bitmap128_set(&table->config.match, OF1X_MATCH_VLAN_VID);
	bitmap128_set(&table->config.match, OF1X_MATCH_VLAN_PCP);
	bitmap128_set(&table->config.match, OF1X_MATCH_ARP_OP);
	bitmap128_set(&table->config.match, OF1X_MATCH_ARP_SHA);
	bitmap128_set(&table->config.match, OF1X_MATCH_ARP_SPA);
	bitmap128_set(&table->config.match, OF1X_MATCH_ARP_THA);
	bitmap128_set(&table->config.match, OF1X_MATCH_ARP_TPA);
	bitmap128_set(&table->config.match, OF1X_MATCH_IP_DSCP);
	bitmap128_set(&table->config.match, OF1X_MATCH_IP_ECN);
	bitmap128_set(&table->config.match, OF1X_MATCH_IP_PROTO);
	bitmap128_set(&table->config.match, OF1X_MATCH_IPV4_SRC);
	bitmap128_set(&table->config.match, OF1X_MATCH_IPV4_DST);
	bitmap128_set(&table->config.match, OF1X_MATCH_TCP_SRC);
	bitmap128_set(&table->config.match, OF1X_MATCH_TCP_DST);
	bitmap128_set(&table->config.match, OF1X_MATCH_UDP_SRC);
	bitmap128_set(&table->config.match, OF1X_MATCH_UDP_DST);
	bitmap128_set(&table->config.match, OF1X_MATCH_SCTP_SRC);
	bitmap128_set(&table->config.match, OF1X_MATCH_SCTP_DST);
	bitmap128_set(&table->config.match, OF1X_MATCH_ICMPV4_TYPE);
	bitmap128_set(&table->config.match, OF1X_MATCH_ICMPV4_CODE);
	bitmap128_set(&table->config.match, OF1X_MATCH_IPV6_SRC);
	bitmap128_set(&table->config.match, OF1X_MATCH_IPV6_DST);
	bitmap128_set(&table->config.match, OF1X_MATCH_IPV6_FLABEL);
	bitmap128_set(&table->config.match, OF1X_MATCH_IPV6_ND_TARGET);
	bitmap128_set(&table->config.match, OF1X_MATCH_IPV6_ND_SLL);
	bitmap128_set(&table->config.match, OF1X_MATCH_IPV6_ND_TLL);
	bitmap128_set(&table->config.match, OF1X_MATCH_IPV6_EXTHDR);
	bitmap128_set(&table->config.match, OF1X_MATCH_ICMPV6_CODE);
	bitmap128_set(&table->config.match, OF1X_MATCH_ICMPV6_TYPE);
	bitmap128_set(&table->config.match, OF1X_MATCH_MPLS_LABEL);
	bitmap128_set(&table->config.match, OF1X_MATCH_MPLS_TC);
	bitmap128_set(&table->config.match, OF1X_MATCH_MPLS_BOS);
	//bitmap128_set(&table->config.match, OF1X_MATCH_PBB_ISID);
	//bitmap128_set(&table->config.match, OF1X_MATCH_TUNNEL_ID);
	bitmap128_set(&table->config.match, OF1X_MATCH_PPPOE_CODE);
	bitmap128_set(&table->config.match, OF1X_MATCH_PPPOE_TYPE);
	bitmap128_set(&table->config.match, OF1X_MATCH_PPPOE_SID);
	bitmap128_set(&table->config.match, OF1X_MATCH_PPP_PROT);
	bitmap128_set(&table->config.match, OF1X_MATCH_GTP_MSG_TYPE);
	bitmap128_set(&table->config.match, OF1X_MATCH_GTP_TEID);

	//Wildcards
	bitmap128_clean(&table->config.wildcards);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_METADATA);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_ETH_DST);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_ETH_SRC);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_VLAN_VID);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_ARP_SHA);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_ARP_SPA);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_ARP_THA);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_ARP_TPA);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_IPV4_SRC);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_IPV4_DST);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_IPV6_SRC);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_IPV6_DST);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_IPV6_FLABEL);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_IPV6_EXTHDR);
	//bitmap128_set(&table->config.wildcards, OF1X_MATCH_PBB_ISID);
	//bitmap128_set(&table->config.wildcards, OF1X_MATCH_TUNNEL_ID);
	bitmap128_set(&table->config.wildcards, OF1X_MATCH_GTP_TEID);


	//Apply actions
	bitmap128_clean(&table->config.apply_actions);
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_COPY_TTL_IN
	bitmap128_set(&table->config.apply_actions, OF1X_AT_POP_VLAN);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_POP_MPLS);		
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_POP_GTP);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_POP_PPPOE);		
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_POP_PBB);		
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_PUSH_PBB);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_PUSH_PPPOE);		
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_PUSH_GTP);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_PUSH_MPLS);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_PUSH_VLAN);		
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_COPY_TTL_OUT);			
	bitmap128_set(&table->config.apply_actions, OF1X_AT_DEC_NW_TTL);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_DEC_MPLS_TTL);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_MPLS_TTL);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_NW_TTL);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_QUEUE);		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ETH_DST);  		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ETH_SRC);  		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ETH_TYPE); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_MPLS_LABEL);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_MPLS_TC);  	   	
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_MPLS_BOS);  	   	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_VLAN_VID); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_VLAN_PCP); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ARP_OPCODE);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ARP_SHA);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ARP_SPA);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ARP_THA);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ARP_TPA);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_NW_PROTO);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_NW_SRC);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_NW_DST);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IP_DSCP);  		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IP_ECN);   		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IP_PROTO); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV4_SRC); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV4_DST); 		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV6_SRC);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV6_DST);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV6_FLABEL);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV6_ND_TARGET);
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV6_ND_SLL);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV6_ND_TLL);	
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_IPV6_EXTHDR);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_TCP_SRC);  		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_TCP_DST);  		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_UDP_SRC);  		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_UDP_DST);  		
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_SCTP_SRC);  		
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_SCTP_DST);  		
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_TP_SRC);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_TP_DST);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ICMPV4_TYPE);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ICMPV4_CODE);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ICMPV6_TYPE);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_ICMPV6_CODE);	
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_PBB_ISID);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_TUNNEL_ID);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_PPPOE_CODE);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_PPPOE_TYPE);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_PPPOE_SID);	   	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_PPP_PROT); 	   	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_GTP_MSG_TYPE);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_SET_FIELD_GTP_TEID);	
	bitmap128_set(&table->config.apply_actions, OF1X_AT_GROUP);			
	//bitmap128_set(&table->config.apply_actions, OF1X_AT_EXPERIMENTER);
	bitmap128_set(&table->config.apply_actions, OF1X_AT_OUTPUT);
		
	//Write actions
	table->config.write_actions = table->config.apply_actions;

	//METADATA (full metadata support)
	table->config.metadata_match = 0xFFFFFFFFFFFFFFFFULL;  
	table->config.metadata_write = 0xFFFFFFFFFFFFFFFFULL; 

	//Instructions
	table->config.instructions = 	(1 << OF1X_IT_APPLY_ACTIONS) |
					(1 << OF1X_IT_CLEAR_ACTIONS) |
					(1 << OF1X_IT_WRITE_ACTIONS) |
					(1 << OF1X_IT_WRITE_METADATA) |
					(1 << OF1X_IT_GOTO_TABLE);
}