Closed ishikawa-ryy closed 11 years ago
現在、trema-edgeによるコントローラ作成を行っていますが、 フローの削除が行えない事象が発生しました。 原因を調べたところ、以下の箇所で使用しているバイトオーダが異なる事により 正常に処理出来なかったように見えるため確認をお願い致します。
FLOW_MODを扱う側はcommandをネットワークバイトオーダから
■trema-edge/src/switch_manager/ofpmsg_send.cから引用 static int update_flowmod_cookie( buffer buf, char service_name ) { struct ofp_flow_mod *flow_mod = buf->data; uint16_t command = ntohs( flow_mod->command ); ★1 uint16_t flags = ntohs( flow_mod->flags ); uint64_t cookie = ntohll( flow_mod->cookie );
switch ( command ) { ★2 case OFPFC_ADD: { uint64_t new_cookie = insert_cookie_entry( &cookie, service_name, flags ); if ( new_cookie == NULL ) { return -1; } flow_mod->cookie = htonll( new_cookie ); flow_mod->flags = htons( flags | OFPFF_SEND_FLOW_REM ); } break;
対してFLOW_MODを作成する側はcommandをホストバイトオーダのまま
■trema-edge/src/lib/openflow_message.cから引用 buffer create_flow_mod( const uint32_t transaction_id, const uint64_t cookie, const uint64_t cookie_mask, const uint8_t table_id, const uint8_t command, const uint16_t idle_timeout, const uint16_t hard_timeout, const uint16_t priority, const uint32_t buffer_id, const uint32_t out_port, const uint32_t out_group, const uint16_t flags, const oxm_matches match, const openflow_instructions instructions ) { (途中省略) flow_mod = ( struct ofp_flow_mod \ ) buffer->data; flow_mod->cookie = htonll( cookie ); flow_mod->cookie_mask = htonll( cookie_mask ); flow_mod->table_id = table_id; flow_mod->command = command; ★3 flow_mod->idle_timeout = htons( idle_timeout ); flow_mod->hard_timeout = htons( hard_timeout ); flow_mod->priority = htons( priority ); flow_mod->buffer_id = htonl( buffer_id ); flow_mod->out_port = htonl( out_port ); flow_mod->out_group = htonl( out_group ); flow_mod->flags = htons( flags ); memset( &flow_mod->pad, 0, sizeof( flow_mod->pad ) ); construct_ofp_match( &flow_mod->match, match );
FLOW_MODを作成する際に★3の箇所を以下のように変更が必要かと
flow_mod->command = command; ↓
1.3でflow modのcommandがuint16からuint8に変更されたときに、修正漏れがありました。
現在、trema-edgeによるコントローラ作成を行っていますが、 フローの削除が行えない事象が発生しました。 原因を調べたところ、以下の箇所で使用しているバイトオーダが異なる事により 正常に処理出来なかったように見えるため確認をお願い致します。
FLOW_MODを扱う側はcommandをネットワークバイトオーダから
ホストバイトオーダに変換して利用しています。(★1、★2の箇所)
■trema-edge/src/switch_manager/ofpmsg_send.cから引用 static int update_flowmod_cookie( buffer buf, char service_name ) { struct ofp_flow_mod *flow_mod = buf->data; uint16_t command = ntohs( flow_mod->command ); ★1 uint16_t flags = ntohs( flow_mod->flags ); uint64_t cookie = ntohll( flow_mod->cookie );
switch ( command ) { ★2 case OFPFC_ADD: { uint64_t new_cookie = insert_cookie_entry( &cookie, service_name, flags ); if ( new_cookie == NULL ) { return -1; } flow_mod->cookie = htonll( new_cookie ); flow_mod->flags = htons( flags | OFPFF_SEND_FLOW_REM ); } break;
(以降省略)
対してFLOW_MODを作成する側はcommandをホストバイトオーダのまま
格納しています。(★3箇所)
■trema-edge/src/lib/openflow_message.cから引用 buffer create_flow_mod( const uint32_t transaction_id, const uint64_t cookie, const uint64_t cookie_mask, const uint8_t table_id, const uint8_t command, const uint16_t idle_timeout, const uint16_t hard_timeout, const uint16_t priority, const uint32_t buffer_id, const uint32_t out_port, const uint32_t out_group, const uint16_t flags, const oxm_matches match, const openflow_instructions instructions ) { (途中省略) flow_mod = ( struct ofp_flow_mod \ ) buffer->data; flow_mod->cookie = htonll( cookie ); flow_mod->cookie_mask = htonll( cookie_mask ); flow_mod->table_id = table_id; flow_mod->command = command; ★3 flow_mod->idle_timeout = htons( idle_timeout ); flow_mod->hard_timeout = htons( hard_timeout ); flow_mod->priority = htons( priority ); flow_mod->buffer_id = htonl( buffer_id ); flow_mod->out_port = htonl( out_port ); flow_mod->out_group = htonl( out_group ); flow_mod->flags = htons( flags ); memset( &flow_mod->pad, 0, sizeof( flow_mod->pad ) ); construct_ofp_match( &flow_mod->match, match );
(以降省略)
FLOW_MODを作成する際に★3の箇所を以下のように変更が必要かと
思いますので、ご確認をお願い致します。
flow_mod->command = command; ↓
flow_mod->command = htons( command );