new link creation.
Bug found by: Gordan Gledec
Submitted by:
Requested by:
Reviewed by:
Approved by:
Obtained from:
setLinkMirror $link2 $link1
if {[[typemodel $lnode1].layer] == "NETWORK" } {
- autoIPv4addr $lnode1 [ifcByPeer $lnode1 $pnode1]
- autoIPv6addr $lnode1 [ifcByPeer $lnode1 $pnode1]
+ set ifc1 [ifcByPeer $lnode1 $pnode1]
+ autoIPv4addr $lnode1 $ifc1
+ autoIPv6addr $lnode1 $ifc1
}
if {[[typemodel $lnode2].layer] == "NETWORK" } {
- autoIPv4addr $lnode2 [ifcByPeer $lnode2 $pnode2]
- autoIPv6addr $lnode2 [ifcByPeer $lnode2 $pnode2]
+ set ifc2 [ifcByPeer $lnode2 $pnode2]
+ autoIPv4addr $lnode2 $ifc2
+ autoIPv6addr $lnode2 $ifc2
+ }
+ if {[[typemodel $lnode1].layer] == "NETWORK" &&
+ [nodeType $lnode1] != "router" } {
+ set ifc1 [ifcByPeer $lnode1 $pnode1]
+ autoIPv4defaultroute $lnode1 $ifc1
+ autoIPv6defaultroute $lnode1 $ifc1
+ }
+ if {[[typemodel $lnode2].layer] == "NETWORK" &&
+ [nodeType $lnode2] != "router" } {
+ set ifc2 [ifcByPeer $lnode2 $pnode2]
+ autoIPv4defaultroute $lnode2 $ifc2
+ autoIPv6defaultroute $lnode2 $ifc2
}
#
autoIPv4addr $lnode2 $ifname2
autoIPv6addr $lnode2 $ifname2
}
+ if { [nodeType $lnode1] != "router" &&
+ [nodeType $lnode2] != "pseudo" &&
+ [[typemodel $lnode1].layer] == "NETWORK" } {
+ autoIPv4defaultroute $lnode1 $ifname1
+ autoIPv6defaultroute $lnode1 $ifname1
+ }
+ if { [nodeType $lnode2] != "router" &&
+ [nodeType $lnode1] != "pseudo" &&
+ [[typemodel $lnode2].layer] == "NETWORK" } {
+ autoIPv4defaultroute $lnode2 $ifname2
+ autoIPv6defaultroute $lnode2 $ifname2
+ }
if { [getNodeCanvas $lnode1] == $curcanvas } {
drawLink $link
if { [[typemodel $node].layer] != "NETWORK" } {
#
- # Shouldn't get called at all in this case
+ # Shouldn't get called at all for link-layer nodes
#
-puts "autoIPv4 shouldn't get called for non-network layer nodes"
+ puts "autoIPv4 called for a [[typemodel $node].layer] layer node"
return ""
}
setIfcIPv4addr $node $iface ""
}
-proc findLANdgIPv4 { bridge } {
- foreach ifc [ifcList $bridge] {
- set peer [peerByIfc $bridge $ifc]
- set peer_if [ifcByPeer $peer $bridge]
- set peer_ipaddr [getIfcIPv4addr $peer $peer_if]
- if { [nodeType $peer] == "router" } {
- return [lindex [split $peer_ipaddr /] 0]
- }
+proc autoIPv4defaultroute { node iface } {
+ if { [[typemodel $node].layer] != "NETWORK" } {
+ #
+ # Shouldn't get called at all for link-layer nodes
+ #
+ puts "autoIPv4defaultroute called for [[typemodel $node].layer] node"
+ return
}
-}
+ set peer_node [logicalPeerByIfc $node $iface]
-proc updateLANdg { bridge } {
- set gw [findLANdgIPv4 $bridge]
- if { $gw == "" } {
- return
- }
- foreach ifc [ifcList $bridge] {
- set peer [peerByIfc $bridge $ifc]
- if { [nodeType $peer] == "pc" || [nodeType $peer] == "host" } {
- setStatIPv4routes $peer [list "0.0.0.0/0 $gw"]
- }
+ if { [[typemodel $peer_node].layer] == "LINK" } {
+ foreach l2node [listLANnodes $peer_node {}] {
+ foreach ifc [ifcList $l2node] {
+ set peer [logicalPeerByIfc $l2node $ifc]
+ if { [nodeType $peer] != "router" } {
+ continue
+ }
+ set peer_if [ifcByLogicalPeer $peer $l2node]
+ set peer_ip4addr [getIfcIPv4addr $peer $peer_if]
+ if { $peer_ip4addr != "" } {
+ set gw [lindex [split $peer_ip4addr /] 0]
+ setStatIPv4routes $node [list "0.0.0.0/0 $gw"]
+ return
+ }
+ }
+ }
+ } else {
+ if { [nodeType $peer_node] != "router" } {
+ return
+ }
+ set peer_if [ifcByLogicalPeer $peer_node $node]
+ set peer_ip4addr [getIfcIPv4addr $peer_node $peer_if]
+ if { $peer_ip4addr != "" } {
+ set gw [lindex [split $peer_ip4addr /] 0]
+ setStatIPv4routes $node [list "0.0.0.0/0 $gw"]
+ return
+ }
}
- return
}
return
}
-proc newLANIPv6 { l3node bridge } {
+
+proc autoIPv6defaultroute { node iface } {
+ if { [[typemodel $node].layer] != "NETWORK" } {
+ #
+ # Shouldn't get called at all for link-layer nodes
+ #
+ puts "autoIPv6defaultroute called for [[typemodel $node].layer] node"
+ return
+ }
+
+ set peer_node [logicalPeerByIfc $node $iface]
+
+ if { [[typemodel $peer_node].layer] == "LINK" } {
+ foreach l2node [listLANnodes $peer_node {}] {
+ foreach ifc [ifcList $l2node] {
+ set peer [logicalPeerByIfc $l2node $ifc]
+ if { [nodeType $peer] != "router" } {
+ continue
+ }
+ set peer_if [ifcByLogicalPeer $peer $l2node]
+ set peer_ip6addr [getIfcIPv6addr $peer $peer_if]
+ if { $peer_ip6addr != "" } {
+ set gw [lindex [split $peer_ip6addr /] 0]
+ setStatIPv6routes $node [list "::/0 $gw"]
+ return
+ }
+ }
+ }
+ } else {
+ if { [nodeType $peer_node] != "router" } {
+ return
+ }
+ set peer_if [ifcByLogicalPeer $peer_node $node]
+ set peer_ip6addr [getIfcIPv6addr $peer_node $peer_if]
+ if { $peer_ip6addr != "" } {
+ set gw [lindex [split $peer_ip6addr /] 0]
+ setStatIPv6routes $node [list "::/0 $gw"]
+ return
+ }
+ }
}