Documentation
¶
Overview ¶
The topology package wraps two versions of the topology. The first is RawTopo (in raw.go), which closely matches the JSON format. It is mainly used for loading the topology from disk. The second data structure is Topo. It is used by Go code directly and thus has a different structure and stricter types.
Since the RawTopo format is pretty self-explanatory, we will focus on the Topo structure here.
The basic layout is as follows:
type Topo struct {
Timestamp int64
TimestampHuman string
ISD_AS addr.IA
Overlay overlay.Type
MTU int
Core bool
BR map[string]BRInfo
BRNames []string
// This maps Interface IDs to internal addresses. Clients use this to
// figure out which internal BR address they have to send their traffic to
// if they want to use a given (external) interface.
IFInfoMap map[common.IFIDType]IFInfo
BS map[string]TopoAddr
BSNames []string
CS map[string]TopoAddr
CSNames []string
PS map[string]TopoAddr
PSNames []string
SB map[string]TopoAddr
SBNames []string
RS map[string]TopoAddr
RSNames []string
DS map[string]TopoAddr
DSNames []string
ZK map[int]TopoAddr
}
The first section contains metadata about the topology. All of these fields should be self-explanatory.
The second section concerns the Border routers. BRNames is just a sorted slice of the names of the BRs in this topolgy. Its contents is exactly the same as the keys in the BR map.
The BR map points from border router names to BRInfo structs, which in turn are lists of IFID type slices. This mapping thus defines which IFIDs belong to a particular border router. The IFInfoMap points from interface IDs to IFInfo structs:
type IFInfo struct {
BRName string
InternalAddr *TopoAddr
Overlay overlay.Type
Local *TopoAddr
Remote *AddrInfo
RemoteIFID common.IFIDType
Bandwidth int
ISD_AS addr.IA
LinkType proto.LinkType
MTU int
}
This struct describes a border router link to another AS, including the internal address applications should send traffic for the link to (InternalAddr) and inoformation about the link itself and the remote side of it.
The third section in Topo concerns the SCION-specific services in the topology. The structure is identical between the various elements. For each service, there is again a sorted slice of names of the servers that provide the service. Additionally, there is a map from those names to TopoAddr structs:
type TopoAddr struct {
IPv4 *topoAddrInt
IPv6 *topoAddrInt
Overlay overlay.Type
}
This structure wraps the possible addresses of a SCION service and describes the overlay to be used for contacting said service.
The two sub-structures for IPv4 and IPv6 only differ in the type of addresses they can contain and look like this:
type topoAddrInt struct {
pubIP net.IP
pubL4Port int
bindIP net.IP
bindL4Port int
OverlayPort int
}
Since Go can handle both v4 and v6 addresses in net.IP, no indirection is needed.
On top of these two structures, there is also AddrInfo:
type AddrInfo struct {
Overlay overlay.Type
IP net.IP
L4Port int
OverlayPort int
}
This struct is used to point to a specific endpoint, i.e. it does not distinguish bind and public ports and can only hold either an IPv4 or an IPv6 address.
Index ¶
- Constants
- func LinkTypeFromString(s string) (proto.LinkType, error)
- func StripBind(rt *RawTopo)
- func StripServices(rt *RawTopo)
- type BRInfo
- type IFInfo
- type RawAddrInfo
- type RawAddrPort
- type RawAddrPortOverlay
- type RawBRInfo
- type RawBRIntf
- type RawTopo
- type Topo
- type TopoAddr
- func (t *TopoAddr) BindAddr(ot overlay.Type) *addr.AppAddr
- func (t *TopoAddr) BindOrPublic(ot overlay.Type) *addr.AppAddr
- func (t *TopoAddr) Equal(o *TopoAddr) bool
- func (t *TopoAddr) OverlayAddr(ot overlay.Type) *overlay.OverlayAddr
- func (t *TopoAddr) PublicAddr(ot overlay.Type) *addr.AppAddr
- func (t *TopoAddr) String() string
Constants ¶
const ( ErrInvalidPub = "Invalid public IP address in topology" ErrInvalidBind = "Invalid bind IP address in topology" ErrTooManyPubV4 = "Too many public IPv4 addresses" ErrTooManyPubV6 = "Too many public IPv6 addresses" ErrTooManyBindV4 = "Too many bind IPv4 addresses" ErrTooManyBindV6 = "Too many bind IPv6 addresses" ErrBindWithoutPubV4 = "Bind IPv4 address without any public IPv4 address" ErrBindWithoutPubV6 = "Bind IPv6 address without any public IPv6 address" ErrExactlyOnePub = "Overlay requires exactly one public address" ErrAtLeastOnePub = "Overlay requires at least one public address" ErrOverlayPort = "Overlay port set for non-UDP overlay" ErrBindAddrEqPubAddr = "Bind address equal to Public address" )
const ( ErrorOpen = "Unable to open topology" ErrorParse = "Unable to parse topology from JSON" ErrorConvert = "Unable to convert RawTopo to Topo" )
const ( CoreLinkName = "CORE" ParentLinkName = "PARENT" ChildLinkName = "CHILD" PeerLinkName = "PEER" )
const CfgName = "topology.json"
Variables ¶
This section is empty.
Functions ¶
func StripServices ¶
func StripServices(rt *RawTopo)
Types ¶
type BRInfo ¶
A list of AS-wide unique interface IDs for a router. These IDs are also used to point to the specific internal address clients should send their traffic to in order to use that interface, via the IFInfoMap member of the Topo struct.
type IFInfo ¶
type RawAddrInfo ¶
type RawAddrInfo struct {
Public []RawAddrPortOverlay
Bind []RawAddrPort `json:",omitempty"`
}
func (RawAddrInfo) String ¶
func (rai RawAddrInfo) String() string
func (*RawAddrInfo) ToTopoAddr ¶
func (s *RawAddrInfo) ToTopoAddr(ot overlay.Type) (t *TopoAddr, err error)
type RawAddrPort ¶
func (RawAddrPort) String ¶
func (a RawAddrPort) String() string
type RawAddrPortOverlay ¶
type RawAddrPortOverlay struct {
RawAddrPort
OverlayPort int `json:",omitempty"`
}
Since Public addresses may be associated with an Overlay port, extend the structure used for Bind addresses.
func (RawAddrPortOverlay) String ¶
func (a RawAddrPortOverlay) String() string
type RawBRInfo ¶
type RawBRInfo struct {
InternalAddr *RawAddrInfo
Interfaces map[common.IFIDType]RawBRIntf
}
type RawBRIntf ¶
type RawBRIntf struct {
Overlay string `json:",omitempty"`
Bind *RawAddrPort `json:",omitempty"`
Public *RawAddrPort `json:",omitempty"`
Remote *RawAddrPort `json:",omitempty"`
Bandwidth int
ISD_AS string
LinkTo string
MTU int
}
type RawTopo ¶
type RawTopo struct {
Timestamp int64
TimestampHuman string
ISD_AS string
Overlay string
MTU int
Core bool
BorderRouters map[string]RawBRInfo `json:",omitempty"`
ZookeeperService map[int]RawAddrPort `json:",omitempty"`
BeaconService map[string]RawAddrInfo `json:",omitempty"`
CertificateService map[string]RawAddrInfo `json:",omitempty"`
PathService map[string]RawAddrInfo `json:",omitempty"`
SibraService map[string]RawAddrInfo `json:",omitempty"`
RainsService map[string]RawAddrInfo `json:",omitempty"`
DiscoveryService map[string]RawAddrInfo `json:",omitempty"`
}
RawTopo is used to un/marshal from/to JSON and should usually not be used by Go code directly. Use Topo (from lib/topology/topology.go) instead.
func LoadRawFromFile ¶
type Topo ¶
type Topo struct {
Timestamp time.Time
TimestampHuman string // This can vary wildly in format and is only for informational purposes.
ISD_AS addr.IA
Overlay overlay.Type
MTU int
Core bool
BR map[string]BRInfo
BRNames []string
// This maps Interface IDs to internal addresses. Clients use this to
// figure out which internal BR address they have to send their traffic to
// if they want to use a given interface.
IFInfoMap map[common.IFIDType]IFInfo
BS map[string]TopoAddr
BSNames []string
CS map[string]TopoAddr
CSNames []string
PS map[string]TopoAddr
PSNames []string
SB map[string]TopoAddr
SBNames []string
RS map[string]TopoAddr
RSNames []string
DS map[string]TopoAddr
DSNames []string
ZK map[int]TopoAddr
}
Topo is the main struct encompassing topology information for use in Go code.
func LoadFromFile ¶
func NewTopo ¶
func NewTopo() *Topo
Create new empty Topo object, including all possible service maps etc.
func TopoFromRaw ¶
Convert a JSON-filled RawTopo to a Topo usabled by Go code.
func (*Topo) GetRandomServer ¶ added in v0.2.0
GetRandomServer returns the application address for a random service of type t; BS, PS, and CS are currently supported. Randomness is taken from the default source. If no server is found, an error is returned.
func (*Topo) GetTopoAddr ¶
func (t *Topo) GetTopoAddr(serviceType proto.ServiceType, id string) *TopoAddr
GetTopoAddr is a helper method that returns the TopoAddress for a specific element ID of type t. nodeType must be one of BS, CS or PS. If the ID is not found, nil is returned.
type TopoAddr ¶
func TopoAddrFromRAI ¶
func TopoAddrFromRAI(s *RawAddrInfo, ot overlay.Type) (*TopoAddr, error)
Create TopoAddr from RawAddrInfo, depending on supplied Overlay type
func (*TopoAddr) BindOrPublic ¶ added in v0.2.0
func (*TopoAddr) OverlayAddr ¶ added in v0.2.0
func (t *TopoAddr) OverlayAddr(ot overlay.Type) *overlay.OverlayAddr