You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
subgraph-oz/network/network.go

194 lines
3.8 KiB

package network
import (
//Builtin
"fmt"
"net"
"strconv"
"strings"
"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 {
// 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
//
Nettype NetType
}
type SandboxNetwork struct {
// 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
//
Nettype NetType
}
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 {
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))
}