You are here

길잃은 초보에게 도움주시길...

급하게 마무리 지어야 할일이라 염치 불구하고 질문 드립니다.
나름대로는 이곳에서 열심히 뒤져보기도 했는데요, 제가 궁금해하는 부분은 다른분들은 이미 알고 계신것 같네요. 비슷한 질문이 없드라구요.

올리는 코드가 좀 엉망이어도 이해해주시리라 믿고 올립니다.
TCL 떠들어 보기 시작한지 3일 지났거든요^^

질문1) radiobutton과 연결된 variable이 버튼 선택 변경시에 update가 되지 않습니다. (.btn_run)

질문1) entry와 연결된 textvariable이 변경시에 update가 되지 않습니다. (ip_addr)

비슷한 이유로 발생하는 문제같긴한데요 그 이유를 도무지 모르겠는걸요. 앞서가신 선배님들의 조언을 기다리겠습니다.

(*) 첨부하는 소스는 host간 binary message 통신 기능을 검증할 요량으로 작성한 것이구요.
.form 파일은 통신시에 사용될 message를 정의한 내용입니다.

(*) 질문과 관계없이 허름한 제 소스를 좀 더 이쁘게 만드는데 도움될 만한 조언주시면 감사히 받겠습니다.^^

그럼 행복하시길...

(첨부에 실패해서 긁어서 올립니다)

#!/usr/bin/tclsh

package require Tk

proc print_msg { str } {
        .txt_frm.text configure -state normal
        .txt_frm.text insert end $str
        .txt_frm.text insert end "\n"
        .txt_frm.text see end
        .txt_frm.text configure -state disabled
}

proc make_msg_list {fd} {
        set rlist ""
        set line_buf ""

        while {1} {
                set line_buf [gets $fd ]
                if {$line_buf == "<MSG_DESC>"} {
                        set line_buf [gets $fd ]
                        if {[lindex $line_buf 0] == "message_name:"} {
                                set tmp [lindex $line_buf 1]
                        } else {
                                set tmp "unknown_name"
                        }

                        set line_buf [gets $fd ]
                        if {[lindex $line_buf 0] == "message_id:"} {
                                lappend tmp [lindex $line_buf 1]
                        } else {
                                lappend tmp "0"
                        }

                        set line_buf [gets $fd ]
                        if {[lindex $line_buf 0] == "message_dir:"} {
                                lappend tmp [lindex $line_buf 1]
                        } else {
                                lappend tmp "unknown"
                        }

                        set line_buf [gets $fd ]
                        if {[lindex $line_buf 0] == "response_name:"} {
                                lappend tmp [lindex $line_buf 1]
                        } else {
                                lappend tmp "unknown"
                        }

                        lappend tmp [tell $fd]

                        lappend rlist $tmp
                }
                if {[eof $fd]} {
                        break
                }
        }
        puts "result_list if : $rlist"
        return $rlist
}

proc pre_make_msg_mode {fd name offset} {
        seek $fd $offset start
        set line_buf [gets $fd]
        set _name "_name_$name"
        set _value "_value_$name"
        set _size  "_size_$name"

        global ${_name}
        global ${_value}
        global ${_size}

        if {$line_buf == "<MODE_START>"} {
                set line_buf [gets $fd]
                for {set i 0} {$line_buf != "<MODE_END>"} {set line_buf [gets $fd]; incr i} {
                        set ${_name}($i) [lindex $line_buf 0]
                        set ${_value}($i) [lindex $line_buf 2]
                        set ${_size}($i)  [lindex $line_buf 1]
                }

        #       set msg [parray ${_value}]

        #       print_msg $msg
        }
}

proc draw_3pack_msgs {fd x} {
        set name_l ""
        set id_l ""

        set fn -1
        lower [frame .mid2]

        for {set i 0} {$i < [llength $x]} {incr i} {
                set name_l [lindex $x $i 0]
                set offset [lindex $x $i 4]
                set cmd_s "make_msg_mode $fd $name_l $offset"

                set req_start [string first "_REQ" $name_l 0]
                if {$req_start != -1} {
                        incr fn
                        #frame .frm$fn -bd 2
                        button .btn_req$fn -text $name_l -width 37  -anchor w -command $cmd_s
                        pack .btn_req$fn -side left -fill x -expand 1
                }

                set ack_start [string first "_ACK" $name_l 0]
                if {$ack_start != -1} {
                        button .btn_ack$fn -text "ACK" -command $cmd_s
                        #pack .frm$fn.btn_ack$fn -side left -fill x
                }

                set nack_start [string first "_NACK" $name_l 0]
                if {$nack_start != -1} {
                        if { "none" != [lindex $x $i 2]} {
                                button .btn_nack$fn -text "NACK" -command $cmd_s
                        } else {
                                button .btn_nack$fn -text "NACK" -state disabled
                        }
                        #pack .frm$fn.btn_nack$fn -side left -fill x

                        #grid .btn_req$fn .btn_ack$fn .btn_nack$fn -in .mid2 -padx 3m -pady 1m -sticky ew

                        grid .btn_req$fn .btn_ack$fn .btn_nack$fn -in .mid2 -sticky ew
                }
                #pack .frm$fn -side top -fill x

        }
        grid columnconfigure .mid2 {0}
        #grid columnconfigure .mid2 {0 1 2} -uniform 1
        #pack .mid2 -fill y -expand yes
        pack .mid2 -fill none -expand 1
}

#lower [frame $w.mid]

#grid $w.ip $w.port -in $w.mid -padx 3m -pady 1m -sticky ew
#grid $w.btn_server $w.btn_client -in $w.mid -padx 3m -pady 1m -sticky ew
#grid columnconfigure $w.mid {0 1} -uniform 1

proc draw_msgs {fd x} {
        set name_l ""
        set id_l ""

        for {set i 0} {$i < [llength $x]} {incr i} {
                set name_l [lindex $x $i 0]
                set offset [lindex $x $i 4]
                set cmd_s "make_msg_mode $fd $name_l $offset"

                print_msg "msg_name: $name_l, cmd_s: $cmd_s"

                button .btn$i -text $name_l -command $cmd_s
                pack .btn$i -side top -fill x
        }
}

proc make_msg_mode {fd name offset} {

        set sw ._$name
        toplevel $sw
        wm title $sw $name

        seek $fd $offset start
        set line_buf [gets $fd]
        set _name "_name_$name"
        set _value "_value_$name"
        set _size  "_size_$name"

        global ${_name}
        global ${_value}
        global ${_size}
        global sock_chan

        if {$line_buf == "<MODE_START>"} {
                set line_buf [gets $fd]
                for {set i 0} {$line_buf != "<MODE_END>"} {set line_buf [gets $fd]; incr i} {
                        set fn "frm$i"
                        frame $sw.$fn -bd 2
                        label $sw.$fn.name -width 20 -anchor e -text [lindex $line_buf 0]
                        label $sw.$fn.size -width 4  -text [lindex $line_buf 1]
                        entry $sw.$fn.value -relief sunken -width 10 -textvariable ${_value}($i)

                        set ${_name}($i) [lindex $line_buf 0]
                        if  {1 != [array exists $_value]} {
                                set ${_value}($i) [lindex $line_buf 2]
                        }
                        set ${_size}($i)  [lindex $line_buf 1]

                        pack $sw.$fn.name -side left
                        pack $sw.$fn.value -side left
                        pack $sw.$fn.size -side left
                        pack $sw.$fn -side top -fill y
                }

                frame $sw.btns -bd 2
                button $sw.btns.b_close -text "Close" -command "destroy $sw"
                if {$sock_chan ==  0} {
                        button $sw.btns.b_send -state disabled -text "Send msg" \
                                                                        -command "SocketServer::send_msg $sock_chan $name"
                } else {
                        button $sw.btns.b_send -text "Send msg" \
                                                                        -command "SocketServer::send_msg $sock_chan $name"
                }
                pack $sw.btns.b_close -side left
                pack $sw.btns.b_send -side left

                pack $sw.btns -side top -fill x
                bind $sw <Return> "destroy $sw"
                #focus $w.frm(0).value
        }
        vwait forever

}

namespace eval SocketServer {
        proc send_msg { chan name } {
                set _name "_name_$name"
                set _value "_value_$name"
                set _size "_size_$name"

                global msg_list
                global ${_name}
                global ${_value}
                global ${_size}

                global _message_size
                global _message_type
                global _transaction_id

                set send_buffer ""
                set item_num 0
                set tot_size 0
                set sig_id [lindex $msg_list [lsearch -index 0 $msg_list $name] 1]
                print_msg "(SEND)>>>>>> name = $name, id = $sig_id"

                for {set item_num 0} {$item_num < [array size ${_value}]} {incr item_num} {
                        set tot_size [expr $tot_size + [set ${_size}($item_num)]]
                }

                set _message_size [expr $tot_size + 12]
                set _message_type $sig_id
                #puts "Send Msg size = $_message_size"

                # send common header

                append send_buffer [binary format Su $_message_size]
                append send_buffer [binary format cu 12 ]       ;       # user_offset
                append send_buffer [binary format cu 0]         ;       # reserved1 = 0x00
                append send_buffer [binary format Su $_message_type]
                append send_buffer [binary format cu 0 ]        ;       # _message_src = 0x00
                append send_buffer [binary format cu 0 ]        ;       # _message_dst = 0x00
                append send_buffer [binary format Su $_transaction_id]
                append send_buffer [binary format Su 0 ]        ;       # reserved2 0x0000

                for {set item_num 0} {$item_num < [array size ${_value}]} {incr item_num} {
                        set size [set ${_size}($item_num)]
                        set value [set ${_value}($item_num)]
                        # print_msg "size = $size, value = $value"

                        switch $size {
                                1       {append send_buffer [binary format cu $value]}
                                2       {append send_buffer [binary format Su $value]}
                                4       {append send_buffer [binary format Iu $value]}
                                default {
                                        set tmp [format "a%d" $size]
                                        append send_buffer [binary format $tmp $value]
                                        # print_msg "send_msg item_size = $size"
                                }
                        }
                        set name [set ${_name}($item_num)]
                        set value [set ${_value}($item_num)]
                        print_msg "$name = $value"
                        # print_msg "current item_num = $item_num"
                }

                # print_msg "send binary message channel $chan. msg size = $item_num"

                puts -nonewline $chan $send_buffer
                flush $chan
                return
        }

        proc make_msg_mode {chan fd name offset} {

                set sw .$name
                toplevel $sw
                wm title $sw $name

                seek $fd $offset start
                set line_buf [gets $fd]
                set _name "_name_$name"
                set _value "_value_$name"
                set _size  "_size_$name"

                global ${_name}
                global ${_value}
                global ${_size}

                if {$line_buf == "<MODE_START>"} {
                        set line_buf [gets $fd]
                        for {set i 0} {$line_buf != "<MODE_END>"} {set line_buf [gets $fd]; incr i} {
                                set fn "frm$i"
                                frame $sw.$fn -bd 2
                                label $sw.$fn.name -width 20 -anchor e -text [lindex $line_buf 0]
                                label $sw.$fn.size -width 4  -text [lindex $line_buf 1]
                                entry $sw.$fn.value -relief sunken -width 10 -textvariable ${_value}($i)

                                set ${_name}($i) [lindex $line_buf 0]
                                set ${_value}($i) [lindex $line_buf 2]
                                set ${_size}($i)  [lindex $line_buf 1]

                                pack $sw.$fn.name -side left
                                pack $sw.$fn.value -side left
                                pack $sw.$fn.size -side left
                                pack $sw.$fn -side top -fill x
                        }

                        frame $sw.btns -bd 2
                        button $sw.btns.b_close -text "Close" -command "parray ${_value}; destroy $sw"
                        button $sw.btns.b_send  -text "Send msg" -command "SocketServer::send_msg $chan $name"
                        pack $sw.btns.b_close -side left
                        pack $sw.btns.b_send -side left

                        pack $sw.btns -side top -fill x
                        bind $sw <Return> "destroy $sw"
                        #focus $w.frm(0).value
                }
                vwait forever

        }

        proc select_msg {chan fd x} {
                set name_l ""
                set id_l ""

                for {set i 0} {$i < [llength $x]} {incr i} {
                        set name_l [lindex $x $i 0]
                        set offset [lindex $x $i 4]
                        set cmd_s "SocketServer::make_msg_mode $chan $fd $name_l $offset"

                        print_msg "msg_name: $name_l, cmd_s: $cmd_s"

                        button .btn$i -text $name_l -command $cmd_s
                        pack .btn$i -side top -fill x
                }
        }

        proc accept {chan addr port} {
                global read_file
                global msg_list
                global fd
                global sock_chan
                set sock_chan $chan

                #puts "$addr:$port says [gets $chan]"

                print_msg "$addr:$port says [gets $chan]"

                puts $chan "Hi! your name is $addr:$port"

                flush $chan
                global sock_chan
                set sock_chan $chan

                #make_line_ary $read_file

                #user_interface
                #send_binary_from_ary $chan
                #select_msg $chan $fd $msg_list

                fconfigure $chan -translation binary
                fconfigure $chan -blocking 1
                fileevent       $chan readable [ list SocketClient::get_msg $chan ]

                vwait forever
                #close $chan
        }
}

namespace eval SocketClient {
        proc get_msg { chan } {
                global _rx_message_size
                global _rx_message_type
                global _rx_transaction_id

                global msg_list
                set item_num 0

                binary scan [read $chan 2] Su _rx_message_size
                binary scan [read $chan 2] Su dummy
                binary scan [read $chan 2] Su _rx_message_type
                binary scan [read $chan 2] Su dummy
                binary scan [read $chan 2] Su _rx_transaction_id
                binary scan [read $chan 2] Su dummy

                set sig_id [format "0x%04x" $_rx_message_type]
                set name [lindex $msg_list [lsearch -index 1 $msg_list $sig_id] 0]

                #puts "rx_header :: w1=0x$_rx_message_size, w2=0x$_rx_message_size, w3=0x$_rx_transaction_id"

                #puts "search :: sig_id = $sig_id, name = $name"
                 
                set _name "_name_$name"
                set _value "_value_$name"
                set _size "_size_$name"

                global ${_name}
                global ${_value}
                global ${_size}

                print_msg "(RECV)<<<<<< name = $name, id = $sig_id"

                for {set item_num 0} {$item_num < [array size ${_value}]} {incr item_num} {
                        set size [set ${_size}($item_num)]
                        set value   0

                        switch $size {
                                1       {binary scan [read $chan 1] cu value}
                                2       {binary scan [read $chan 2] Su value}
                                4       {binary scan [read $chan 4] Iu value}
                                default {
                                        set tmp [format "a%d" $size]
                                        binary scan [read $chan $size] $tmp value
                                }
                        }
                        set name [set ${_name}($item_num)]
                        print_msg "$name = $value"
                }
        }

        proc get_raw_data {chan} {
                binary scan [read $chan 4] I bread
                set hex_fom [format "%08x" $bread]
                puts "bread = $bread, $hex_fom"
        }

        proc connect { ip port } {
                global client_exit
                global sock_chan
                set chan [socket $ip $port]
                set sock_chan $chan

                puts $chan "hello"
                flush $chan
                #puts "$ip:$port says [gets $chan]"
                print_msg "$ip:$port says [gets $chan]"

                fconfigure $chan -translation binary
                fconfigure $chan -blocking 1

                fileevent       $chan readable [ list SocketClient::get_msg $chan ]
                #fileevent      $chan readable [ list SocketClient::get_raw_data $chan ]

                vwait client_exit

                puts "closing socket..."
                close $chan
        }
}

#label $w.msg -font $font -wraplength 4i -justify left -text "This window contains a simple form where you can type in the various entries and use tabs to move circularly between the entries."
#label $w.msg -wraplength 4i -justify left -text "This window contains a simple form where you can type in the various entries and use tabs to move circularly between the entries."
#pack $w.msg -side top

set file_name "BIM_MSG.form"
set sock_chan 0

set _message_size       0
set _message_type       0
set _transaction_id     0

set _rx_message_size    0
set _rx_message_type    0
set _rx_transaction_id  0

puts "file_name is : $file_name"

set ip_addr "192.168.1.242"
set port    "19999"
set client_exit "initial"
set server_exit "initial"

#set w .

#catch {destroy $w}
#toplevel $w
wm title . "BIM IPC emulator."

set w .txt_frm
frame $w -bd 2
text $w.text -yscrollcommand [list $w.scroll set] -setgrid 1 -height 30 -width 55
scrollbar $w.scroll -command [list $w.text yview]
pack $w.scroll -side right -fill y
pack $w.text -expand yes -fill both
pack $w -side bottom -fill x

$w.text insert 0.0 \
{This window is output window.}
$w.text configure -state disabled

set w ""
labelframe $w.ip -text "IP Address"
entry $w.ip.value -validate key -invcmd bell -width 15 \
                                                        -vcmd {expr {[string length %P]<16}} -textvariable ip_addr
pack $w.ip.value -fill x -expand 1 -padx 1m -pady 1m

labelframe $w.port -text "Port #"
entry $w.port.value -validate key -invcmd bell -width 5 \
                                                        -vcmd {expr {[string length %P]<6}} -textvariable port
pack $w.port.value -fill x -expand 1 -padx 1m -pady 1m

set run_mode "server"

labelframe $w.mode -text "Mode"
radiobutton $w.mode.server -text "Server" -variable run_mode -relief flat \
                                                        -value "server" -tristatevalue "multi"
pack $w.mode.server -side left -pady 4 -anchor w -fill x
radiobutton $w.mode.client -text "Client" -variable run_mode -relief flat \
                                                        -value "client" -tristatevalue "multi"
pack $w.mode.client -side left -pady 4 -anchor w -fill x
pack $w.mode -side top -pady 2 -anchor w -fill x

proc Run_Pressed {mode} {
        global port
        global ip_addr

        puts "mode = $mode"
        .btn_run configure -text "STOP"

        if {$mode == "server"} {
                print_msg "\nServer started..."
                socket -server SocketServer::accept $port
        } else {
                print_msg "\nClient started..."
                SocketClient::connect $ip_addr $port
        }
}

button $w.btn_run -text "RUN " -width 5 -height 2 -pady 6 -command "Run_Pressed $run_mode"
#pack $w.btn_run -side top -pady 2 -anchor w -fill x

lower [frame $w.mid]
grid $w.ip $w.port $w.mode $w.btn_run -in $w.mid -padx 1m -pady 1m -sticky ew
pack $w.mid -fill y -expand 1

set fd [open $file_name r 644]
set msg_list [make_msg_list $fd]

for {set i 0} { $i < [llength  $msg_list] } {incr i} {
        set name [lindex $msg_list $i 0]
        set offset [lindex $msg_list $i 4]
        pre_make_msg_mode $fd $name $offset
}
#draw_msgs $fd $msg_list
draw_3pack_msgs $fd $msg_list

#socket -server SocketServer::accept 19999

vwait forever

<BIM_HEADER>
#field_name byte_size value
message_size    2       0
user_offset             1       12
reserved1               1       0
message_type    2       0
message_src             1       0
message_dst             1       0
transaction_id  2       0
reserved2               2       0

<MSG_DESC>
message_name:   STATUS_REQ
message_id:     0x0000
message_dir:    both
response__name: STATUS_ACK
<MODE_START>
<MODE_END>

<MSG_DESC>
message_name:   STATUS_ACK
message_id:     0x0001
message_dir:    both
response__name:
<MODE_START>
oper_sts                1       0
num_ports               1       2
portnum0                4       0
linksts0                1       2
portspeed0              2       2
duplex0                 1       1
portnum1                4       1
linksts1                1       2
portspeed1              2       2
duplex1                 1       1
<MODE_END>

<MSG_DESC>
message_name:   STATUS_NACK
message_id:     0x0002
message_dir:    both
response__name:
<MODE_START>
cause                   1       7
<MODE_END>

<MSG_DESC>
message_name:   INVENTORY_REQ
message_id:     0x0010
message_dir:    both
response__name:         INVENTORY_ACK
<MODE_START>
<MODE_END>

<MSG_DESC>
message_name:   INVENTORY_ACK
message_id:     0x0011
message_dir:    both
response__name:        
<MODE_START>
vendorcode              17      naonworks_2008
sw_version              8       V1.0.4
hw_version              8       V1.1
<MODE_END>

<MSG_DESC>
message_name:   INVENTORY_NACK
message_id:     0x0012
message_dir:    both
response__name:
<MODE_START>
cause                   1       7
<MODE_END>

<MSG_DESC>
message_name:   RESET_REQ
message_id:     0x0020
message_dir:    both
response__name: RESET_ACK      
<MODE_START>
<MODE_END>

<MSG_DESC>
message_name:   RESET_ACK
message_id:     0x0021
message_dir:    both
response__name:        
<MODE_START>
<MODE_END>

<MSG_DESC>
message_name:   RESET_NACK
message_id:     0x0022
message_dir:    none
response__name:        
<MODE_START>
<MODE_END>

<MSG_DESC>
message_name:   SET_TIME_REQ
message_id:     0x1000
message_dir:    both
response__name: SET_TIME_ACK
<MODE_START>
datetime                32      "2008-03-10 12:35:00"
<MODE_END>

<MSG_DESC>
message_name:   SET_TIME_ACK
message_id:     0x1001
message_dir:    both
response__name:        
<MODE_START>
<MODE_END>

<MSG_DESC>
message_name:   SET_TIME_NACK
message_id:     0x1002
message_dir:    none
response__name:        
<MODE_START>
<MODE_END>

<MSG_DESC>
message_name:   BH_PORT_CONFIG_REQ
message_id:     0x1010
message_dir:    both
response__name: BH_PORT_CONFIG_ACK
<MODE_START>
portspeed               2       2
<MODE_END>

<MSG_DESC>
message_name:   BH_PORT_CONFIG_ACK
message_id:     0x1011
message_dir:    both
response__name:        
<MODE_START>
<MODE_END>

<MSG_DESC>
message_name:   BH_PORT_CONFIG_NACK
message_id:     0x1012
message_dir:    both
response__name:        
<MODE_START>
cause                   1       7
<MODE_END>

<MSG_DESC>
message_name:   VLAN_CONFIG_REQ
message_id:     0x1020
message_dir:    both
response__name: VLAN_CONFIG_ACK
<MODE_START>
vid                             4       100
egress_list             4       0x000a
untag_list              4       0x000a
command                 4       5
<MODE_END>

<MSG_DESC>
message_name:   VLAN_CONFIG_ACK
message_id:     0x1021
message_dir:    both
response__name:        
<MODE_START>
vid                             4       100
<MODE_END>

<MSG_DESC>
message_name:   VLAN_CONFIG_NACK
message_id:     0x1022
message_dir:    both
response__name:        
<MODE_START>
vid                             4       100
cause                   1       7
<MODE_END>

<MSG_DESC>
message_name:   VLAN_DECONFIG_REQ
message_id:     0x1030
message_dir:    both
response__name: VLAN_DECONFIG_ACK
<MODE_START>
vid                             4       100
<MODE_END>

<MSG_DESC>
message_name:   VLAN_DECONFIG_ACK
message_id:     0x1031
message_dir:    both
response__name:        
<MODE_START>
vid                             4       100
<MODE_END>

<MSG_DESC>
message_name:   VLAN_DECONFIG_NACK
message_id:     0x1032
message_dir:    both
response__name:        
<MODE_START>
vid                             4       100
cause                   1       7
<MODE_END>

<MSG_DESC>
message_name:   VLAN_PORT_CONFIG_REQ
message_id:     0x1040
message_dir:    both
response__name: VLAN_PORT_CONFIG_ACK
<MODE_START>
port                    4       1
pvid                    4       100
ingfilter               4       1
egfilter                4       1
untagfilter             4       1
<MODE_END>

<MSG_DESC>
message_name:   VLAN_PORT_CONFIG_ACK
message_id:     0x1041
message_dir:    both
response__name:        
<MODE_START>
port                    4       1
<MODE_END>

<MSG_DESC>
message_name:   VLAN_PORT_CONFIG_NACK
message_id:     0x1042
message_dir:    both
response__name:        
<MODE_START>
port                    4       1
cause                   1       7
<MODE_END>

<MSG_DESC>
message_name:   PAT_INTERFACE_CONFIG_REQ
message_id:     0x1050
message_dir:    both
response__name: PAT_INTERFACE_CONFIG_ACK
<MODE_START>
name                    32      public_interface
type                    4       1
ip0                             1   10
ip1                             1   20
ip2                             1   30
ip3                             1   9
mask0                   1   255
mask1                   1   255
mask2                   1   255
mask3                   1   0
gateway0                1   10
gateway1                1   20
gateway2                1   30
gateway3                1   254
vlan                    4       77
tagged                  4       1
<MODE_END>

<MSG_DESC>
message_name:   PAT_INTERFACE_CONFIG_ACK
message_id:     0x1051
message_dir:    both
response__name:
<MODE_START>
name                    32      public_interface
<MODE_END>

<MSG_DESC>
message_name:   PAT_INTERFACE_CONFIG_NACK
message_id:     0x1052
message_dir:    both
response__name:
<MODE_START>
name                    32      public_interface
cause           1       9
<MODE_END>

<MSG_DESC>
message_name:   PAT_INTERFACE_DECONFIG_REQ
message_id:     0x1060
message_dir:    both
response__name: PAT_INTERFACE_DECONFIG_ACK
<MODE_START>
name                    32      public_interface
<MODE_END>

<MSG_DESC>
message_name:   PAT_INTERFACE_DECONFIG_ACK
message_id:     0x1061
message_dir:    both
response__name:
<MODE_START>
name                    32      public_interface
<MODE_END>

<MSG_DESC>
message_name:   PAT_INTERFACE_DECONFIG_NACK
message_id:     0x1062
message_dir:    both
response__name:
<MODE_START>
name                    32      public_interface
cause           1       9
<MODE_END>

<MSG_DESC>
message_name:   PAT_RULE_CONFIG_REQ
message_id:     0x1070
message_dir:    both
response__name: PAT_RULE_CONFIG_ACK
<MODE_START>
protocol                4       1
public_ip0              1   10
public_ip1              1   20
public_ip2              1   30
public_ip3              1   9
public_port             4       10000
local_ip0               1   172
local_ip1               1   0
local_ip2               1   0
local_ip3               1   1
local_port              4       20000
<MODE_END>

<MSG_DESC>
message_name:   PAT_RULE_CONFIG_ACK
message_id:     0x1071
message_dir:    both
response__name:
<MODE_START>
protocol                4       1
public_ip0              1   10
public_ip1              1   20
public_ip2              1   30
public_ip3              1   9
public_port             4       10000
local_ip0               1   172
local_ip1               1   0
local_ip2               1   0
local_ip3               1   1
local_port              4       20000
<MODE_END>

<MSG_DESC>
message_name:   PAT_RULE_CONFIG_NACK
message_id:     0x1072
message_dir:    both
response__name:
<MODE_START>
protocol                4       1
public_ip0              1   10
public_ip1              1   20
public_ip2              1   30
public_ip3              1   9
public_port             4       10000
local_ip0               1   172
local_ip1               1   0
local_ip2               1   0
local_ip3               1   1
local_port              4       20000
cause                   1       1
<MODE_END>

<MSG_DESC>
message_name: PAT_RULE_DECONFIG_REQ    
message_id:     0x1080
message_dir:    both
response__name: PAT_RULE_DECONFIG_ACK
<MODE_START>
protocol                4       1
public_ip0              1   10
public_ip1              1   20
public_ip2              1   30
public_ip3              1   9
public_port             4       10000
local_ip0               1   172
local_ip1               1   0
local_ip2               1   0
local_ip3               1   1
local_port              4       20000
<MODE_END>

<MSG_DESC>
message_name: PAT_RULE_DECONFIG_ACK    
message_id:     0x1081
message_dir:    both
response__name:
<MODE_START>
protocol                4       1
public_ip0              1   10
public_ip1              1   20
public_ip2              1   30
public_ip3              1   9
public_port             4       10000
local_ip0               1   172
local_ip1               1   0
local_ip2               1   0
local_ip3               1   1
local_port              4       20000
<MODE_END>

<MSG_DESC>
message_name: PAT_RULE_DECONFIG_NACK   
message_id:     0x1082
message_dir:    both
response__name:
<MODE_START>
protocol                4       1
public_ip0              1   10
public_ip1              1   20
public_ip2              1   30
public_ip3              1   9
public_port             4       10000
local_ip0               1   172
local_ip1               1   0
local_ip2               1   0
local_ip3               1   1
local_port              4       20000
cause           1               9
<MODE_END>