Skip to content

Commit

Permalink
local SCION addresses for apps (#55)
Browse files Browse the repository at this point in the history
* updated bat and shttp examples

* updated sensorapp

* updated camerapp

* updated helloworld

* fix for server and client running on same AS

* updated bwtester

* updated roughtime

* goimport

* resolve with hostsfile

First try to find localhost by looking at defined hosts, fall back too loopback address

* updated usage info

* use default 0 port for bwtestclient

* better logging, make full scion address mandatory
  • Loading branch information
chaehni committed Apr 2, 2019
1 parent a6d1c2e commit 0b3c575
Show file tree
Hide file tree
Showing 20 changed files with 264 additions and 155 deletions.
11 changes: 8 additions & 3 deletions bat/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,19 @@ Refer to the original repository for general usage.

### Usage

In contrast to the original tool, we require a local SCION address.
If you're running bat in a VM, your local address can be inferred:
bat uses a default localhost address to bind to the dispatcher. You can overwrite localhost by adding a line to `/etc/hosts`. E.g:

```
17-ffaa:1:1,[127.0.1.1] localhost
```

Then run bat:

```
bat GET https://server/api/download
```

In case this fails or you are running a different setup, provide the local address using the ```-l``` flag:
In case you want to bind to a specific address, specify it using the `-l` flag:

```
bat -l ISD-AS,[IP]:port GET https://server/api/download
Expand Down
17 changes: 9 additions & 8 deletions bat/bat.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import (
"strconv"
"strings"

"github.com/netsec-ethz/scion-apps/lib/scionutil"
"github.com/netsec-ethz/scion-apps/lib/shttp"
slog "github.com/scionproto/scion/go/lib/log"
"github.com/scionproto/scion/go/lib/snet"
Expand Down Expand Up @@ -103,16 +104,16 @@ func init() {
flag.Parse()

// SCION: add shttp Transport to defaultSetting
var laddr *snet.Addr
var err error
if local == "" {
var err error
local, err = readIsdAS()
if err != nil {
log.Fatal("Cannot infer local address. Please provide it using the -l flag.")
}
laddr, err = scionutil.GetLocalhost()
} else {
laddr, err = snet.AddrFromString(local)
}

laddr, err := snet.AddrFromString(local)
if err != nil {
log.Fatal("Could get local address: ", err)
usage()
}

Expand Down Expand Up @@ -384,7 +385,7 @@ Usage:
bat [flags] [METHOD] URL [ITEM [ITEM]]
flags:
-l Local SCION address, for VMs this can be omitted
-l Local SCION address, omit to bind to localhost
-a, -auth=USER[:PASS] Pass a username:password pair as the argument
-b, -bench=false Sends bench requests to URL
-b.N=1000 Number of requests to run
Expand Down Expand Up @@ -415,7 +416,7 @@ ITEM:
Example:
bat -l 17-ffaa:1:1[IP]:0 https://server:8080/download
bat https://server:8080/download
The protocol can be omitted, bat defaults to HTTPS
For more help information please refer to https://github.com/netsec-ethz/scion-apps/bat
Expand Down
13 changes: 0 additions & 13 deletions bat/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@ package main

import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strconv"
"strings"
)
Expand Down Expand Up @@ -84,13 +81,3 @@ func FormatBytes(i int64) (result string) {
result = strings.Trim(result, " ")
return
}

func readIsdAS() (string, error) {
spath := os.Getenv("SC")
ia, err := ioutil.ReadFile(filepath.Join(spath, "gen/ia"))
if err != nil {
return "", err
}
repl := strings.Replace(string(ia), "_", ":", -1)
return strings.Join([]string{repl, ",[10.0.2.15]:0"}, ""), nil
}
59 changes: 22 additions & 37 deletions bwtester/bwtestclient/bwtestclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (

. "github.com/netsec-ethz/scion-apps/bwtester/bwtestlib"
"github.com/netsec-ethz/scion-apps/lib/scionutil"
"github.com/scionproto/scion/go/lib/addr"
"github.com/scionproto/scion/go/lib/sciond"
"github.com/scionproto/scion/go/lib/snet"
"github.com/scionproto/scion/go/lib/spath"
Expand Down Expand Up @@ -54,6 +55,7 @@ func printUsage() {
fmt.Println("bwtestclient -c ClientSCIONAddress -s ServerSCIONAddress -cs t,size,num,bw -sc t,size,num,bw -i")
fmt.Println("A SCION address is specified as ISD-AS,[IP Address]:Port")
fmt.Println("Example SCION address 1-1011,[192.33.93.166]:42002")
fmt.Println("ClientSCIONAddress can be omitted, the application then binds to localhost")
fmt.Println("-cs specifies time duration (seconds), packet size (bytes), number of packets, target bandwidth " +
"of client->server test")
fmt.Println("\tThe question mark character ? can be used as wildcard when setting the test parameters " +
Expand Down Expand Up @@ -247,9 +249,7 @@ func main() {
dispatcherPath string
clientCCAddrStr string
serverCCAddrStr string
clientISDASIP string
serverISDASIP string
clientPort uint16
clientPort uint
serverPort uint16
// Address of client control channel (CC)
clientCCAddr *snet.Addr
Expand Down Expand Up @@ -284,6 +284,7 @@ func main() {
flag.StringVar(&dispatcherPath, "dispatcher", "/run/shm/dispatcher/default.sock",
"Path to dispatcher socket")
flag.StringVar(&clientCCAddrStr, "c", "", "Client SCION Address")
flag.UintVar(&clientPort, "p", 0, "Client Port (only used when Client Address not set)")
flag.StringVar(&serverCCAddrStr, "s", "", "Server SCION Address")
flag.StringVar(&serverBwpStr, "sc", DefaultBwtestParameters, "Server->Client test parameter")
flag.StringVar(&clientBwpStr, "cs", DefaultBwtestParameters, "Client->Server test parameter")
Expand All @@ -308,13 +309,15 @@ func main() {
overlayType = "udp4"
}
// Create SCION UDP socket
if len(clientCCAddrStr) > 0 {
clientCCAddr, err = snet.AddrFromString(clientCCAddrStr)
Check(err)
} else {
printUsage()
Check(fmt.Errorf("Error, client address needs to be specified with -c"))
if len(clientCCAddrStr) == 0 {
clientCCAddrStr, err = scionutil.GetLocalhostString()
clientCCAddrStr = fmt.Sprintf("%s:%d", clientCCAddrStr, clientPort)
}
Check(err)

clientCCAddr, err = snet.AddrFromString(clientCCAddrStr)
Check(err)

if len(serverCCAddrStr) > 0 {
serverCCAddr, err = snet.AddrFromString(serverCCAddrStr)
Check(err)
Expand Down Expand Up @@ -351,42 +354,24 @@ func main() {
serverCCAddr.Path = spath.New(pathEntry.Path.FwdPath)
serverCCAddr.Path.InitOffsets()
serverCCAddr.NextHop, _ = pathEntry.HostInfo.Overlay()
} else {
scionutil.InitSCION(clientCCAddr)
}

CCConn, err = snet.DialSCION(overlayType, clientCCAddr, serverCCAddr)
Check(err)
// fmt.Println("clientCCAddr -> serverCCAddr", clientCCAddr, "->", serverCCAddr)

ci := strings.LastIndex(serverCCAddrStr, ":")
if ci < 0 {
// This should never happen, an error would have been much earlier detected
Check(fmt.Errorf("Malformed server address"))
}
serverISDASIP = serverCCAddrStr[:ci]
auxUint64, err := strconv.ParseUint(serverCCAddrStr[ci+1:], 10, 16)
Check(err)
serverPort = uint16(auxUint64)
// fmt.Println("serverISDASIP:", serverISDASIP)
// fmt.Println("serverPort:", serverPort)

ci = strings.LastIndex(clientCCAddrStr, ":")
if ci < 0 {
// This should never happen, an error would have been much earlier detected
Check(fmt.Errorf("Malformed client address"))
}
clientISDASIP = clientCCAddrStr[:ci]
auxUint64, err = strconv.ParseUint(clientCCAddrStr[ci+1:], 10, 16)
clientPort = uint16(auxUint64)
Check(err)
// fmt.Println("clientISDASIP:", clientISDASIP)
// fmt.Println("clientPort:", clientPort)
// get the port used by clientCC after it bound to the dispatcher (because it might be 0)
clientPort = uint((CCConn.LocalAddr()).(*snet.Addr).Host.L4.Port())
serverPort = serverCCAddr.Host.L4.Port()

// Address of client data channel (DC)
clientDCAddr, err = snet.AddrFromString(clientISDASIP + ":" + strconv.Itoa(int(clientPort)+1))
Check(err)
clientDCAddr = &snet.Addr{IA: clientCCAddr.IA, Host: &addr.AppAddr{
L3: clientCCAddr.Host.L3, L4: addr.NewL4UDPInfo(uint16(clientPort) + 1)}}
// Address of server data channel (DC)
serverDCAddr, err = snet.AddrFromString(serverISDASIP + ":" + strconv.Itoa(int(serverPort)+1))
Check(err)
serverDCAddr = &snet.Addr{IA: serverCCAddr.IA, Host: &addr.AppAddr{
L3: serverCCAddr.Host.L3, L4: addr.NewL4UDPInfo(uint16(serverPort) + 1)}}

// Set path on data connection
if !serverDCAddr.IA.Eq(clientDCAddr.IA) {
serverDCAddr.Path = spath.New(pathEntry.Path.FwdPath)
Expand Down
53 changes: 37 additions & 16 deletions bwtester/bwtestserver/bwtestserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import (
"github.com/kormat/fmt15"

. "github.com/netsec-ethz/scion-apps/bwtester/bwtestlib"
"github.com/netsec-ethz/scion-apps/lib/scionutil"
"github.com/scionproto/scion/go/lib/addr"
"github.com/scionproto/scion/go/lib/sciond"
"github.com/scionproto/scion/go/lib/snet"
)
Expand Down Expand Up @@ -53,6 +55,7 @@ func purgeOldResults() {
var (
serverCCAddrStr string
serverCCAddr *snet.Addr
serverPort uint
err error
CCConn snet.Conn
sciondPath *string
Expand All @@ -67,6 +70,7 @@ func main() {

// Fetch arguments from command line
flag.StringVar(&serverCCAddrStr, "s", "", "Server SCION Address")
flag.UintVar(&serverPort, "p", 40002, "Server Port (only used when Server Address not set)")
id := flag.String("id", "bwtester", "Element ID")
logDir := flag.String("log_dir", "./logs", "Log directory")
sciondPath = flag.String("sciond", "", "Path to sciond socket")
Expand All @@ -82,37 +86,59 @@ func main() {
os.Mkdir(*logDir, 0744)
}
log.Root().SetHandler(log.MultiHandler(
log.LvlFilterHandler(log.LvlError,
log.LvlFilterHandler(log.LvlDebug,
log.StreamHandler(os.Stderr, fmt15.Fmt15Format(fmt15.ColorMap))),
log.LvlFilterHandler(log.LvlDebug,
log.Must.FileHandler(fmt.Sprintf("%s/%s.log", *logDir, *id),
fmt15.Fmt15Format(nil)))))
log.Debug("Setup info:", "id", *id)

if *useIPv6 {
overlayType = "udp6"
} else {
overlayType = "udp4"
}
if len(serverCCAddrStr) > 0 {
runServer(serverCCAddrStr)

var pflag bool
var sflag bool
flag.Visit(func(f *flag.Flag) {
if f.Name == "s" {
sflag = true
}
if f.Name == "p" {
pflag = true
}
})
if sflag && pflag {
log.Warn("Flags '-s' and '-p' provided. '-p' has no effect")
}

// Create the SCION UDP socket
if len(serverCCAddrStr) == 0 {
serverCCAddr, err = scionutil.GetLocalhost()
serverCCAddr.Host.L4 = addr.NewL4UDPInfo(uint16(serverPort))
if err != nil {
printUsage()
LogFatal("Unable to start server", "err", err)
}
} else {
printUsage()
LogFatal("Error, server address needs to be specified with -s")
serverCCAddr, err = snet.AddrFromString(serverCCAddrStr)
if err != nil {
printUsage()
LogFatal("Unable to start server", "err", err)
}
if serverCCAddr.Host.L4 == nil {
LogFatal("Port in server address is missing")
}
}
}

func runServer(serverCCAddrStr string) {
// Create the SCION UDP socket
serverCCAddr, err = snet.AddrFromString(serverCCAddrStr)
runServer()
if err != nil {
printUsage()
LogFatal("Unable to start server", "err", err)
}
}

func runServer() {

if *sciondFromIA {
if *sciondPath != "" {
Expand All @@ -125,12 +151,7 @@ func runServer(serverCCAddrStr string) {
log.Info("Starting server")
snet.Init(serverCCAddr.IA, *sciondPath, *dispatcherPath)

ci := strings.LastIndex(serverCCAddrStr, ":")
if ci < 0 {
// This should never happen, an error would have been much earlier detected
LogFatal("Malformed server address")
}
serverISDASIP := serverCCAddrStr[:ci]
serverISDASIP := fmt.Sprintf("%s,[%s]", serverCCAddr.IA, serverCCAddr.Host.L3)

CCConn, err = snet.ListenSCION(overlayType, serverCCAddr)
Check(err)
Expand Down
8 changes: 5 additions & 3 deletions camerapp/imagefetcher/imagefetcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"log"
"time"

"github.com/netsec-ethz/scion-apps/lib/scionutil"
"github.com/scionproto/scion/go/lib/sciond"
"github.com/scionproto/scion/go/lib/snet"
)
Expand All @@ -37,6 +38,7 @@ func printUsage() {
fmt.Println("imagefetcher -c ClientSCIONAddress -s ServerSCIONAddress")
fmt.Println("The SCION address is specified as ISD-AS,[IP Address]:Port")
fmt.Println("Example SCION address 1-1011,[192.33.93.166]:42002")
fmt.Println("ClientSCIONAddress can be omitted, the application then binds to localhost")
}

func fetchFileInfo(udpConnection snet.Conn) (string, uint32, time.Duration, error) {
Expand Down Expand Up @@ -182,11 +184,11 @@ func main() {
// Create SCION UDP socket
if len(clientAddress) > 0 {
local, err = snet.AddrFromString(clientAddress)
check(err)
} else {
printUsage()
check(fmt.Errorf("Error, client address needs to be specified with -c"))
local, err = scionutil.GetLocalhost()
}
check(err)

if len(serverAddress) > 0 {
remote, err = snet.AddrFromString(serverAddress)
check(err)
Expand Down
Loading

0 comments on commit 0b3c575

Please sign in to comment.