/* 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); }
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; }
/* 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); }
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; }
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; }
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 }
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); }