trema / trema-edge

Transient repository for Trema OF1.3 branch
27 stars 14 forks source link

FLOW_MODに使用するバイトオーダ #47

Closed ishikawa-ryy closed 11 years ago

ishikawa-ryy commented 11 years ago

現在、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 );

sugyo commented 11 years ago

1.3でflow modのcommandがuint16からuint8に変更されたときに、修正漏れがありました。