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