Beispiel #1
0
/* Instruction groups init and destroy */
void __of1x_init_match_group(of1x_match_group_t* group){

	platform_memset(group,0,sizeof(of1x_match_group_t));
	
	//Set min max 
	group->ver_req.min_ver = OF1X_MIN_VERSION;
	group->ver_req.max_ver = OF1X_MAX_VERSION;
	
	//OF1.0 full wildcard
	bitmap128_set(&group->of10_wildcard_bm, OF1X_MATCH_ETH_DST);
	bitmap128_set(&group->of10_wildcard_bm, OF1X_MATCH_ETH_SRC);
	bitmap128_set(&group->of10_wildcard_bm, OF1X_MATCH_NW_SRC);
	bitmap128_set(&group->of10_wildcard_bm, OF1X_MATCH_NW_DST);
}
Beispiel #2
0
void of1x_set_packet_action_on_write_actions(of1x_write_actions_t* write_actions, of1x_packet_action_t* action){

	if( unlikely(write_actions==NULL) || action->type >= OF1X_AT_NUMBER ){
		assert(0);
		return;
	}

	//Update field
	write_actions->actions[action->type].__field = action->__field;
	write_actions->actions[action->type].send_len = action->send_len;

	if( !bitmap128_is_bit_set(&write_actions->bitmap, action->type) ){
		write_actions->num_of_actions++;
		bitmap128_set(&write_actions->bitmap, action->type);
	}

	//This cannot be done here, because the group might NOT exist yet; the sum will happen 
	//during insertion validation (for both action and WRITE_ACTIONS instruction
	//if (action->type == OF1X_AT_OUTPUT)
	//	write_actions->num_of_output_actions++;
	//if(action->type == OF1X_AT_GROUP)
	//	write_actions->num_of_output_actions+=action->group->num_of_output_actions;
	
	//Update fast validation flags (required versions)
	if(write_actions->ver_req.min_ver < action->ver_req.min_ver)
		write_actions->ver_req.min_ver = action->ver_req.min_ver;
	if(write_actions->ver_req.max_ver > action->ver_req.max_ver)
		write_actions->ver_req.max_ver = action->ver_req.max_ver;
}
Beispiel #3
0
/* Addition of an action to an action group */
void of1x_push_packet_action_to_group(of1x_action_group_t* group, of1x_packet_action_t* action){

	if( unlikely(action==NULL) || action->type >= OF1X_AT_NUMBER ){
		assert(0);
		return;
	}

	if(!group->tail){
		group->head = action; 
		action->prev = NULL;
	}else{
		action->prev = group->tail;
		group->tail->next = action;
	}		

	group->tail = action;
	action->next = NULL;
	
	group->num_of_actions++;

	//This cannot be done here, because the group might NOT exist yet; the sum will happen 
	//during insertion validation (for both action and WRITE_ACTIONS instruction
	//if(action->type == OF1X_AT_OUTPUT)
	//	group->num_of_output_actions++;
	
	//if(action->type == OF1X_AT_GROUP)
	//	group->num_of_output_actions+=action->group->num_of_output_actions;

	//Update fast validation flags (required versions)
	if(group->ver_req.min_ver < action->ver_req.min_ver)
		group->ver_req.min_ver = action->ver_req.min_ver;
	if(group->ver_req.max_ver > action->ver_req.max_ver)
		group->ver_req.max_ver = action->ver_req.max_ver;
	bitmap128_set(&group->bitmap, action->type);
}
Beispiel #4
0
void __of1x_match_group_push_back(of1x_match_group_t* group, of1x_match_t* match){

	if ( unlikely(group==NULL) || unlikely(match==NULL) )
		return;

	match->next = match->prev = NULL; 

	if(!group->head){
		group->head = match;
	}else{
		match->prev = group->tail;
		group->tail->next = match;
	}

	//Deduce new tail and update validation flags and num of elements
	do{
		//Update fast validation flags (required versions)
		if(group->ver_req.min_ver < match->ver_req.min_ver)
			group->ver_req.min_ver = match->ver_req.min_ver;
		if(group->ver_req.max_ver > match->ver_req.max_ver)
			group->ver_req.max_ver = match->ver_req.max_ver;

		//Update matches
		bitmap128_set(&group->match_bm, match->type);

		if(!match->has_wildcard)
			bitmap128_unset(&group->of10_wildcard_bm, match->type);
		else	
			bitmap128_set(&group->wildcard_bm, match->type);

		group->num_elements++;

		if(match->next == NULL)
			break;
		else	
			match = match->next;
	}while(1);
	
	//Add new tail
	group->tail = match;
	
}
Beispiel #5
0
void __of13_set_table_defaults(of1x_flow_table_t* table){
	
	//Being lazy...
	__of12_set_table_defaults(table);

	//Setting the default behaviour to continue to the next table.
	table->default_action = OF1X_TABLE_MISS_CONTINUE; 
	
	//Adding OF1.3 only matches
	bitmap128_set(&table->config.match, OF1X_MATCH_MPLS_BOS); 

	//TODO: add METER instruction when implemented
	
	table->config.table_miss_config = 0x0;
}
Beispiel #6
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 

}
Beispiel #7
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);
}