added support for olsrv2 and olsr adjacency observer widgets requires nrlConsole.py to be in the path
This commit is contained in:
parent
e905648d68
commit
75b65730d1
1 changed files with 155 additions and 41 deletions
196
gui/widget.tcl
196
gui/widget.tcl
|
@ -1916,9 +1916,21 @@ proc get_router_id {node} {
|
||||||
return [string range $line 11 end]
|
return [string range $line 11 end]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if {[lsearch [getNodeServices $node true] "OLSR"] == 0 } {
|
||||||
|
|
||||||
|
set sock [lindex [getEmulPlugin $node] 2]
|
||||||
|
set exec_num [newExecCallbackRequest adjacencyrouterid]
|
||||||
|
set cmd "nrlConsole.py ${node}_olsr i"
|
||||||
|
sendExecMessage $sock $node $cmd $exec_num 0x30
|
||||||
|
return ""
|
||||||
|
} elseif {[lsearch [getNodeServices $node true] "OLSRv2"] == 0 } {
|
||||||
|
set sock [lindex [getEmulPlugin $node] 2]
|
||||||
|
set exec_num [newExecCallbackRequest adjacencyrouterid]
|
||||||
|
set cmd "nrlConsole.py ${node}_olsrv2 i"
|
||||||
|
sendExecMessage $sock $node $cmd $exec_num 0x30
|
||||||
|
return ""
|
||||||
|
}
|
||||||
if { $oper_mode != "exec" } { return }
|
if { $oper_mode != "exec" } { return }
|
||||||
|
|
||||||
# use exec message here for retrieving router ID
|
# use exec message here for retrieving router ID
|
||||||
set sock [lindex [getEmulPlugin $node] 2]
|
set sock [lindex [getEmulPlugin $node] 2]
|
||||||
set exec_num [newExecCallbackRequest adjacencyrouterid]
|
set exec_num [newExecCallbackRequest adjacencyrouterid]
|
||||||
|
@ -1934,7 +1946,7 @@ proc get_router_id {node} {
|
||||||
# Adjacency widget de/initialization
|
# Adjacency widget de/initialization
|
||||||
#
|
#
|
||||||
proc widget_adjacency_init {command} {
|
proc widget_adjacency_init {command} {
|
||||||
global enable_Adjacency enable_Adjacency_v2 enable_Adjacency_v3
|
global enable_Adjacency enable_Adjacency_OSPFv2 enable_Adjacency_OSPFv3 enable_Adjacency_OLSR enable_Adjacency_OLSRv2
|
||||||
global node_list adjacency_cache adjacency_config adjacency_lock
|
global node_list adjacency_cache adjacency_config adjacency_lock
|
||||||
global g_execRequests
|
global g_execRequests
|
||||||
set c .c
|
set c .c
|
||||||
|
@ -1943,26 +1955,42 @@ proc widget_adjacency_init {command} {
|
||||||
array set g_execRequests [list adjacency ""]
|
array set g_execRequests [list adjacency ""]
|
||||||
|
|
||||||
# Menu item selected on/off
|
# Menu item selected on/off
|
||||||
if { $command == "menu2" || $command == "menu3" } {
|
if { $command == "menu2" || $command == "menu3" || $command == "menu4" || $command == "menu5" } {
|
||||||
# set global enable flag for v2/v3 adjacency display
|
# set global enable flag for v2/v3 adjacency display
|
||||||
set enable_Adjacency \
|
set enable_Adjacency \
|
||||||
[expr {$enable_Adjacency_v2 | $enable_Adjacency_v3}]
|
[expr {$enable_Adjacency_OSPFv2 | $enable_Adjacency_OSPFv3 | $enable_Adjacency_OLSR | $enable_Adjacency_OLSRv2}]
|
||||||
# toggle other OSPFv2/v3 menu items off
|
# toggle other OSPFv2/v3 menu items off
|
||||||
if { $command == "menu2" && $enable_Adjacency_v2 } {
|
if { $command == "menu2" && $enable_Adjacency_OSPFv2 } {
|
||||||
set enable_Adjacency_v3 0
|
set enable_Adjacency_OSPFv3 0
|
||||||
|
set enable_Adjacency_OLSR 0
|
||||||
|
set enable_Adjacency_OLSRv2 0
|
||||||
set adjacency_config(proto) "ip ospf"
|
set adjacency_config(proto) "ip ospf"
|
||||||
} elseif { $command == "menu3" && $enable_Adjacency_v3 } {
|
} elseif { $command == "menu3" && $enable_Adjacency_OSPFv3 } {
|
||||||
set enable_Adjacency_v2 0
|
set enable_Adjacency_OSPFv2 0
|
||||||
|
set enable_Adjacency_OLSR 0
|
||||||
|
set enable_Adjacency_OLSRv2 0
|
||||||
set adjacency_config(proto) "ipv6 ospf6"
|
set adjacency_config(proto) "ipv6 ospf6"
|
||||||
}
|
} elseif { $command == "menu4" && $enable_Adjacency_OLSR } {
|
||||||
|
set enable_Adjacency_OSPFv2 0
|
||||||
|
set enable_Adjacency_OSPFv3 0
|
||||||
|
set enable_Adjacency_OLSRv2 0
|
||||||
|
set adjacency_config(proto) "OLSR_proto"
|
||||||
|
} elseif { $command == "menu5" && $enable_Adjacency_OLSRv2 } {
|
||||||
|
set enable_Adjacency_OSPFv2 0
|
||||||
|
set enable_Adjacency_OSPFv3 0
|
||||||
|
set enable_Adjacency_OLSR 0
|
||||||
|
set adjacency_config(proto) "OLSRv2_proto"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Initialize
|
# Initialize
|
||||||
if { $enable_Adjacency && $command != "stop" } {
|
if { $enable_Adjacency && $command != "stop" } {
|
||||||
array unset adjacency_cache *
|
array unset adjacency_cache *
|
||||||
foreach node $node_list { ;# save router-id node pairs for later lookup
|
foreach node $node_list { ;# save router-id node pairs for later lookup
|
||||||
if { [nodeType $node] != "router" } { continue }
|
if { [nodeType $node] != "router" } { continue }
|
||||||
if {[lsearch [getNodeServices $node true] "zebra"] < 0} {
|
if {[lsearch [getNodeServices $node true] "zebra"] < 0 &&
|
||||||
|
[lsearch [getNodeServices $node true] "OLSR"] < 0 &&
|
||||||
|
[lsearch [getNodeServices $node true] "OLSRv2"] < 0} {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
set rtrid [get_router_id $node]
|
set rtrid [get_router_id $node]
|
||||||
|
@ -1975,8 +2003,10 @@ proc widget_adjacency_init {command} {
|
||||||
# De-initialize
|
# De-initialize
|
||||||
if { !$enable_Adjacency || $command == "stop" } {
|
if { !$enable_Adjacency || $command == "stop" } {
|
||||||
set enable_Adjacency 0
|
set enable_Adjacency 0
|
||||||
set enable_Adjacency_v2 0
|
set enable_Adjacency_OSPFv2 0
|
||||||
set enable_Adjacency_v3 0
|
set enable_Adjacency_OSPFv3 0
|
||||||
|
set enable_Adjacency_OLSR 0
|
||||||
|
set enable_Adjacency_OLSRv2 0
|
||||||
$c delete -withtags "adjline"
|
$c delete -withtags "adjline"
|
||||||
after 200 { .c delete -withtags "adjline" }
|
after 200 { .c delete -withtags "adjline" }
|
||||||
}
|
}
|
||||||
|
@ -1992,20 +2022,52 @@ proc widget_adjacency_periodic { now } {
|
||||||
|
|
||||||
set proto $adjacency_config(proto)
|
set proto $adjacency_config(proto)
|
||||||
|
|
||||||
foreach node $node_list {
|
if { $proto == "OLSR_proto" } {
|
||||||
if { [nodeType $node] != "router" } { continue }
|
foreach node $node_list {
|
||||||
if { [getNodeCanvas $node] != $curcanvas } { continue }
|
if { [nodeType $node] != "router" } { continue }
|
||||||
if {[lsearch [getNodeServices $node true] "zebra"] < 0} {
|
if { [getNodeCanvas $node] != $curcanvas } { continue }
|
||||||
continue
|
if {[lsearch [getNodeServices $node true] "OLSR"] < 0} {
|
||||||
}
|
continue
|
||||||
|
}
|
||||||
|
if { $adjacency_lock == $node } { continue }
|
||||||
|
# when using daemon, send Execute Message and draw line using
|
||||||
|
# widget_adjacency_callback after the response has been received
|
||||||
|
set sock [lindex [getEmulPlugin $node] 2]
|
||||||
|
set exec_num [newExecCallbackRequest adjacency]
|
||||||
|
set cmd "nrlConsole.py ${node}_olsr n"
|
||||||
|
sendExecMessage $sock $node $cmd $exec_num 0x30
|
||||||
|
}
|
||||||
|
} elseif { $proto == "OLSRv2_proto" } {
|
||||||
|
foreach node $node_list {
|
||||||
|
if { [nodeType $node] != "router" } { continue }
|
||||||
|
if { [getNodeCanvas $node] != $curcanvas } { continue }
|
||||||
|
if {[lsearch [getNodeServices $node true] "OLSRv2"] < 0} {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if { $adjacency_lock == $node } { continue }
|
||||||
|
# when using daemon, send Execute Message and draw line using
|
||||||
|
# widget_adjacency_callback after the response has been received
|
||||||
|
set sock [lindex [getEmulPlugin $node] 2]
|
||||||
|
set exec_num [newExecCallbackRequest adjacency]
|
||||||
|
set cmd "nrlConsole.py ${node}_olsrv2 n"
|
||||||
|
sendExecMessage $sock $node $cmd $exec_num 0x30
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
foreach node $node_list {
|
||||||
|
if { [nodeType $node] != "router" } { continue }
|
||||||
|
if { [getNodeCanvas $node] != $curcanvas } { continue }
|
||||||
|
if {[lsearch [getNodeServices $node true] "zebra"] < 0} {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if { $adjacency_lock == $node } { continue }
|
if { $adjacency_lock == $node } { continue }
|
||||||
# when using daemon, send Execute Message and draw line using
|
# when using daemon, send Execute Message and draw line using
|
||||||
# widget_adjacency_callback after the response has been received
|
# widget_adjacency_callback after the response has been received
|
||||||
set sock [lindex [getEmulPlugin $node] 2]
|
set sock [lindex [getEmulPlugin $node] 2]
|
||||||
set exec_num [newExecCallbackRequest adjacency]
|
set exec_num [newExecCallbackRequest adjacency]
|
||||||
set cmd "vtysh -c 'show $proto neighbor'"
|
set cmd "vtysh -c 'show $proto neighbor'"
|
||||||
sendExecMessage $sock $node $cmd $exec_num 0x30
|
sendExecMessage $sock $node $cmd $exec_num 0x30
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2016,14 +2078,16 @@ proc exec_adjacency_callback { node execnum cmd result status } {
|
||||||
global g_api_exec_num
|
global g_api_exec_num
|
||||||
set changed 0
|
set changed 0
|
||||||
set c .c
|
set c .c
|
||||||
|
|
||||||
set proto $adjacency_config(proto)
|
set proto $adjacency_config(proto)
|
||||||
array set colors $adjacency_config(colors)
|
array set colors $adjacency_config(colors)
|
||||||
if { $adjacency_config(offset) } { set o 5 } else { set o 0 }
|
if { $adjacency_config(offset) } { set o 5 } else { set o 0 }
|
||||||
|
|
||||||
$c addtag adjdelete withtag "adjline && $node" ;# flag del all adjlines
|
$c addtag adjdelete withtag "adjline && $node" ;# flag del all adjlines
|
||||||
set adjs [getadj_from_neighbors $result $proto]
|
set adjs [getadj_from_neighbors $result $proto]
|
||||||
|
|
||||||
foreach adj $adjs {
|
foreach adj $adjs {
|
||||||
|
|
||||||
set peer [lindex $adj 0]
|
set peer [lindex $adj 0]
|
||||||
set line [$c find withtag "adjline && $node && $peer"]
|
set line [$c find withtag "adjline && $node && $peer"]
|
||||||
|
|
||||||
|
@ -2065,23 +2129,54 @@ proc exec_adjacency_callback { node execnum cmd result status } {
|
||||||
proc exec_adjacencyrouterid_callback { node execnum cmd result status } {
|
proc exec_adjacencyrouterid_callback { node execnum cmd result status } {
|
||||||
global adjacency_cache
|
global adjacency_cache
|
||||||
|
|
||||||
# match both OSPFv2 and OSPFv3 responses
|
#check if olsr or olsrv2 are running
|
||||||
set rid [regexp -inline {Router[- ]ID[:]? [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+} \
|
if {[lsearch [getNodeServices $node true] "OLSR"] == 0 ||
|
||||||
$result]
|
[lsearch [getNodeServices $node true] "OLSRv2"] == 0 } {
|
||||||
if {$rid != ""} {
|
set lines [split $result "\n"]
|
||||||
set rtrid [eval lindex $rid end]
|
set rtrid [lindex $lines 1]
|
||||||
array set adjacency_cache [list $rtrid $node]
|
array set adjacency_cache [list $rtrid $node]
|
||||||
|
} else {
|
||||||
|
# match both OSPFv2 and OSPFv3 responses
|
||||||
|
set rid [regexp -inline {Router[- ]ID[:]? [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+} \
|
||||||
|
$result]
|
||||||
|
if {$rid != ""} {
|
||||||
|
set rtrid [eval lindex $rid end]
|
||||||
|
array set adjacency_cache [list $rtrid $node]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# helper to convert neighbor list into adjacencies list
|
# helper to convert neighbor list into adjacencies list
|
||||||
proc getadj_from_neighbors { raw_input proto } {
|
proc getadj_from_neighbors { raw_input proto } {
|
||||||
set ret { }
|
set ret { }
|
||||||
|
#OLSR conversions
|
||||||
|
if { $proto == "OLSRv2_proto" || $proto == "OLSR_proto"} {
|
||||||
|
foreach line [split $raw_input "\n"] {
|
||||||
|
if { $line == "neighbors" } { continue }
|
||||||
|
if { $line == "end-neighbors" } { continue }
|
||||||
|
if { $line == "" } { continue }
|
||||||
|
set fields [split $line " "]
|
||||||
|
lassign $fields rtrid state metric mpr
|
||||||
|
# convert to OSPFv3 to simplify coloring
|
||||||
|
switch -exact -- "$state" {
|
||||||
|
"SYM" { set state "Full" }
|
||||||
|
"ASYM" { set state "Init" }
|
||||||
|
"LOST" { set state "Down" }
|
||||||
|
"MPR" { set state "Full" }
|
||||||
|
"PENDING" { set state "Init" }
|
||||||
|
"INVALID" { set state "Down" }
|
||||||
|
}
|
||||||
|
lappend ret [list $rtrid $state]
|
||||||
|
}
|
||||||
|
return $ret
|
||||||
|
}
|
||||||
|
#OSPF converstion
|
||||||
|
|
||||||
#Neighbor ID Pri DeadTime State/IfState Duration I/F[State]
|
#Neighbor ID Pri DeadTime State/IfState Duration I/F[State]
|
||||||
#10.0.0.2 1 00:00:06 Init/PointToPoint 00:00:00 eth0[PointToP
|
#10.0.0.2 1 00:00:06 Init/PointToPoint 00:00:00 eth0[PointToP
|
||||||
#10.0.0.2 1 00:00:06 Twoway/PointToPoint 00:00:00 eth0[PointToP
|
#10.0.0.2 1 00:00:06 Twoway/PointToPoint 00:00:00 eth0[PointToP
|
||||||
#10.0.0.2 1 00:00:06 Full/PointToPoint 00:00:38 eth0[PointToP
|
#10.0.0.2 1 00:00:06 Full/PointToPoint 00:00:38 eth0[PointToP
|
||||||
#10.0.7.2 1 Full/Backup 37.240s 10.0.0.2 eth0:10.0.0.1
|
#10.0.7.2 1 Full/Backup 37.240s 10.0.0.2 eth0:10.0.0.1
|
||||||
foreach line [split $raw_input "\n"] {
|
foreach line [split $raw_input "\n"] {
|
||||||
set rtrid [string trim [string range $line 0 14]]
|
set rtrid [string trim [string range $line 0 14]]
|
||||||
if { $rtrid == "Neighbor ID" } { continue }
|
if { $rtrid == "Neighbor ID" } { continue }
|
||||||
|
@ -2150,12 +2245,31 @@ proc widget_adjacency_init_submenu { m } {
|
||||||
$m add cascade -label "Adjacency" -menu $m.adj
|
$m add cascade -label "Adjacency" -menu $m.adj
|
||||||
set w "Adjacency"
|
set w "Adjacency"
|
||||||
|
|
||||||
foreach v [list 2 3] {
|
# foreach v [list 2 3] {
|
||||||
global enable_${w}_v${v}
|
# global enable_${w}_v${v}
|
||||||
set enable_${w}_v${v} 0
|
# set enable_${w}_v${v} 0
|
||||||
$m.adj add checkbutton -label "OSPFv$v" -variable enable_${w}_v${v} \
|
# $m.adj add checkbutton -label "OSPFv$v" -variable enable_${w}_v${v} \
|
||||||
-command "[lindex $widgets($w) 1] menu$v"
|
# -command "[lindex $widgets($w) 1] menu$v"
|
||||||
}
|
# }
|
||||||
|
global enable_Adjacency_OSPFv2
|
||||||
|
set enable_Adjacency_OSPFv2 0
|
||||||
|
$m.adj add checkbutton -label "OSPFv2" -variable enable_Adjacency_OSPFv2 \
|
||||||
|
-command "[lindex $widgets(Adjacency) 1] menu2"
|
||||||
|
|
||||||
|
global enable_Adjacency_OSPFv3
|
||||||
|
set enable_Adjacency_OSPFv3 0
|
||||||
|
$m.adj add checkbutton -label "OSPFv3" -variable enable_Adjacency_OSPFv3 \
|
||||||
|
-command "[lindex $widgets(Adjacency) 1] menu3"
|
||||||
|
|
||||||
|
global enable_Adjacency_OLSR
|
||||||
|
set enable_Adjacency_OLSR 0
|
||||||
|
$m.adj add checkbutton -label "OLSR" -variable enable_Adjacency_OLSR \
|
||||||
|
-command "[lindex $widgets(Adjacency) 1] menu4"
|
||||||
|
|
||||||
|
global enable_Adjacency_OLSRv2
|
||||||
|
set enable_Adjacency_OLSRv2 0
|
||||||
|
$m.adj add checkbutton -label "OLSRv2" -variable enable_Adjacency_OLSRv2 \
|
||||||
|
-command "[lindex $widgets(Adjacency) 1] menu5"
|
||||||
}
|
}
|
||||||
|
|
||||||
# load the widgets.conf file when this file is loaded
|
# load the widgets.conf file when this file is loaded
|
||||||
|
|
Loading…
Reference in a new issue