|
|
|
package network
|
|
|
|
|
|
|
|
import (
|
|
|
|
//Builtin
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/milosgajdos83/tenus"
|
|
|
|
"github.com/op/go-logging"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
ozDefaultInterfaceBridgeBase = "oz"
|
|
|
|
ozDefaultInterfaceBridge = ozDefaultInterfaceBridgeBase + "0"
|
|
|
|
ozDefaultInterfacePrefix = "veth"
|
|
|
|
ozDefaultInterfaceInternal = "eth0"
|
|
|
|
ozMaxRandTries = 3
|
|
|
|
)
|
|
|
|
|
|
|
|
type NetType string
|
|
|
|
|
|
|
|
const (
|
|
|
|
TYPE_HOST NetType = "host"
|
|
|
|
TYPE_EMPTY NetType = "empty"
|
|
|
|
TYPE_BRIDGE NetType = "bridge"
|
|
|
|
)
|
|
|
|
|
|
|
|
type HostNetwork struct {
|
|
|
|
// Bridge interface
|
|
|
|
Interface tenus.Bridger
|
|
|
|
// Gateway ip (bridge ip)
|
|
|
|
Gateway net.IP
|
|
|
|
// Gateway ip (bridge ip)
|
|
|
|
GatewayNet *net.IPNet
|
|
|
|
// Bridge netmask
|
|
|
|
Netmask net.IP
|
|
|
|
// Broadcast ip
|
|
|
|
Broadcast net.IP
|
|
|
|
// IP class (ie: /24)
|
|
|
|
Class string
|
|
|
|
// Minimum longip available ip
|
|
|
|
Min uint64
|
|
|
|
// Maximum longip available ip
|
|
|
|
Max uint64
|
|
|
|
// Bridge interface MAC Address
|
|
|
|
BridgeMAC string
|
|
|
|
// The type of network configuration
|
|
|
|
Nettype NetType
|
|
|
|
}
|
|
|
|
|
|
|
|
type SandboxNetwork struct {
|
|
|
|
// veth interface is present
|
|
|
|
Interface tenus.Linker
|
|
|
|
// Name of the veth in the host
|
|
|
|
VethHost string
|
|
|
|
// Temporary name of the guest' veth in the host
|
|
|
|
VethGuest string
|
|
|
|
// Guest ip address
|
|
|
|
Ip string
|
|
|
|
// Gateway ip (bridge ip)
|
|
|
|
Gateway net.IP
|
|
|
|
// IP class (ie: /24)
|
|
|
|
Class string
|
|
|
|
// The type of network configuration
|
|
|
|
Nettype NetType
|
|
|
|
// Host side virtual interface
|
|
|
|
Veth tenus.Vether
|
|
|
|
}
|
|
|
|
|
|
|
|
var privateNetworkRanges []string
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
privateNetworkRanges = []string{
|
|
|
|
// RFC1918 Private ranges
|
|
|
|
"10.0.0.0/8",
|
|
|
|
"172.16.0.0/12",
|
|
|
|
"192.168.0.0/16",
|
|
|
|
// Documentation / Testnet 2
|
|
|
|
"192.51.100.0/24",
|
|
|
|
// Documentation/ Testnet
|
|
|
|
"192.0.2.0/24",
|
|
|
|
// Inter-network communication
|
|
|
|
"192.18.0.0/15",
|
|
|
|
// Documentation / Testnet 3
|
|
|
|
"203.0.113.0/24",
|
|
|
|
// Carrier grade NAT
|
|
|
|
"100.64.0.0/10",
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Print status of the network interfaces
|
|
|
|
func NetPrint(log *logging.Logger) {
|
|
|
|
strLine := ""
|
|
|
|
ifs, _ := net.Interfaces()
|
|
|
|
|
|
|
|
strHeader := fmt.Sprintf("%-15.15s%-30.30s%-16.16s%-6.6s", "Interface", "IP", "Mask", "Status")
|
|
|
|
strHr := ""
|
|
|
|
ii := len(strHeader)
|
|
|
|
for i := 0; i < ii; i++ {
|
|
|
|
strHr += "-"
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Info(strHr)
|
|
|
|
|
|
|
|
log.Info(strHeader)
|
|
|
|
|
|
|
|
for _, netif := range ifs {
|
|
|
|
if strings.HasPrefix(netif.Name, ozDefaultInterfacePrefix) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
addrs, _ := netif.Addrs()
|
|
|
|
|
|
|
|
strLine = fmt.Sprintf("%-15.14s", netif.Name)
|
|
|
|
|
|
|
|
if len(addrs) > 0 {
|
|
|
|
strLine += fmt.Sprintf("%-30.30s", addrs[0])
|
|
|
|
|
|
|
|
bIP, brIP, _ := net.ParseCIDR(addrs[0].String())
|
|
|
|
if bIP.To4() != nil {
|
|
|
|
bMask := []byte(brIP.Mask)
|
|
|
|
strLine += fmt.Sprintf("%-16.16s", net.IPv4(bMask[0], bMask[1], bMask[2], bMask[3]).String())
|
|
|
|
} else {
|
|
|
|
strLine += fmt.Sprintf("%-16.16s", "")
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
strLine += fmt.Sprintf("%-30.30s%-16.16s", "", "")
|
|
|
|
}
|
|
|
|
|
|
|
|
if netif.Flags&net.FlagUp == 1 {
|
|
|
|
strLine += fmt.Sprintf("%-6.6s", "up")
|
|
|
|
} else {
|
|
|
|
strLine += fmt.Sprintf("%-6.6s", "down")
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(addrs) > 1 {
|
|
|
|
strLine += fmt.Sprintf("")
|
|
|
|
|
|
|
|
for _, addr := range addrs[1:] {
|
|
|
|
strLine += fmt.Sprintf("%-15.15s%-30.30s", "", addr)
|
|
|
|
|
|
|
|
bIP, brIP, _ := net.ParseCIDR(addr.String())
|
|
|
|
|
|
|
|
if bIP.To4() != nil {
|
|
|
|
bMask := []byte(brIP.Mask)
|
|
|
|
strLine += fmt.Sprintf("%-20.20s", net.IPv4(bMask[0], bMask[1], bMask[2], bMask[3]).String())
|
|
|
|
} else {
|
|
|
|
strLine += fmt.Sprintf("%-16.16s", "")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
strLine += fmt.Sprintf("\n")
|
|
|
|
|
|
|
|
log.Info(strLine)
|
|
|
|
}
|
|
|
|
|
|
|
|
log.Info(strHr)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// Convert longip to net.IP
|
|
|
|
func inet_ntoa(ipnr uint64) net.IP {
|
|
|
|
var bytes [4]byte
|
|
|
|
bytes[0] = byte(ipnr & 0xFF)
|
|
|
|
bytes[1] = byte((ipnr >> 8) & 0xFF)
|
|
|
|
bytes[2] = byte((ipnr >> 16) & 0xFF)
|
|
|
|
bytes[3] = byte((ipnr >> 24) & 0xFF)
|
|
|
|
|
|
|
|
return net.IPv4(bytes[3], bytes[2], bytes[1], bytes[0])
|
|
|
|
}
|
|
|
|
|
|
|
|
// Convert net.IP to longip
|
|
|
|
func inet_aton(ipnr net.IP) uint64 {
|
|
|
|
bits := strings.Split(ipnr.String(), ".")
|
|
|
|
|
|
|
|
b0, _ := strconv.Atoi(bits[0])
|
|
|
|
b1, _ := strconv.Atoi(bits[1])
|
|
|
|
b2, _ := strconv.Atoi(bits[2])
|
|
|
|
b3, _ := strconv.Atoi(bits[3])
|
|
|
|
|
|
|
|
var sum uint64
|
|
|
|
|
|
|
|
sum += uint64(b0) << 24
|
|
|
|
sum += uint64(b1) << 16
|
|
|
|
sum += uint64(b2) << 8
|
|
|
|
sum += uint64(b3)
|
|
|
|
|
|
|
|
return sum
|
|
|
|
}
|
|
|
|
|
|
|
|
func net_getbroadcast(bIP net.IP, ipMask net.IPMask) net.IP {
|
|
|
|
bMask := []byte(ipMask)
|
|
|
|
byteIP := bIP.To4()
|
|
|
|
|
|
|
|
return net.IPv4(
|
|
|
|
byteIP[0]|(bMask[0]^0xFF),
|
|
|
|
byteIP[1]|(bMask[1]^0xFF),
|
|
|
|
byteIP[2]|(bMask[2]^0xFF),
|
|
|
|
byteIP[3]|(bMask[3]^0xFF))
|
|
|
|
|
|
|
|
}
|