@@ -33,10 +33,10 @@ import (
33
33
"time"
34
34
"unicode"
35
35
36
+ "inet.af/netaddr"
37
+
36
38
. "github.com/netsec-ethz/scion-apps/bwtester/bwtestlib"
37
- "github.com/netsec-ethz/scion-apps/pkg/appnet"
38
- "github.com/scionproto/scion/go/lib/addr"
39
- "github.com/scionproto/scion/go/lib/snet"
39
+ "github.com/netsec-ethz/scion-apps/pkg/pan"
40
40
)
41
41
42
42
const (
@@ -128,7 +128,7 @@ func parseBwtestParameters(s string, defaultPktSize int64) (BwtestParameters, er
128
128
a4 = parseBandwidth (a [3 ])
129
129
a2 = (a4 * a1 ) / (a3 * 8 )
130
130
} else {
131
- a2 = int64 ( defaultPktSize )
131
+ a2 = defaultPktSize
132
132
}
133
133
} else {
134
134
a2 = getPacketSize (a [1 ], defaultPktSize )
@@ -248,83 +248,83 @@ func getPacketCount(count string) int64 {
248
248
return a3
249
249
}
250
250
251
+ func usageErr (msg string ) {
252
+ printUsage ()
253
+ if msg != "" {
254
+ fmt .Println ("\n Error:" , msg )
255
+ }
256
+ os .Exit (2 )
257
+ }
258
+
259
+ func checkUsageErr (err error ) {
260
+ if err != nil {
261
+ usageErr (err .Error ())
262
+ }
263
+ }
264
+
251
265
func main () {
252
266
var (
253
- serverCCAddrStr string
254
- clientBwpStr string
255
- serverBwpStr string
256
- interactive bool
257
- pathAlgo string
267
+ local pan.IPPortValue
268
+ serverCCAddr pan.UDPAddr
269
+ clientBwpStr string
270
+ serverBwpStr string
271
+ interactive bool
272
+ sequence string
273
+ preference string
258
274
)
259
275
260
276
flag .Usage = printUsage
261
- flag .StringVar (& serverCCAddrStr , "s" , "" , "Server SCION Address" )
277
+ flag .Var (& local , "local" , "Local address" )
278
+ flag .Var (& serverCCAddr , "s" , "Server SCION Address" )
262
279
flag .StringVar (& serverBwpStr , "sc" , DefaultBwtestParameters , "Server->Client test parameter" )
263
280
flag .StringVar (& clientBwpStr , "cs" , DefaultBwtestParameters , "Client->Server test parameter" )
264
281
flag .BoolVar (& interactive , "i" , false , "Interactive path selection, prompt to choose path" )
265
- flag .StringVar (& pathAlgo , "pathAlgo" , "" , "Path selection algorithm / metric (\" shortest\" , \" mtu\" )" )
282
+ flag .StringVar (& sequence , "sequence" , "" , "Sequence of space separated hop predicates to specify path" )
283
+ flag .StringVar (& preference , "preference" , "" , "Preference sorting order for paths. " +
284
+ "Comma-separated list of available sorting options: " +
285
+ strings .Join (pan .AvailablePreferencePolicies , "|" ))
266
286
267
287
flag .Parse ()
268
288
flagset := make (map [string ]bool )
269
289
// record if flags were set or if default value was used
270
290
flag .Visit (func (f * flag.Flag ) { flagset [f .Name ] = true })
271
291
272
292
if flag .NFlag () == 0 {
273
- // no flag was set, only print usage and exit
274
- printUsage ()
275
- os .Exit (2 )
293
+ usageErr ("" )
276
294
}
277
- if len (serverCCAddrStr ) == 0 {
278
- printUsage ()
279
- fmt .Println ("\n Server address needs to be specified with -s" )
280
- os .Exit (2 )
295
+ if ! serverCCAddr .IsValid () {
296
+ usageErr ("server address needs to be specified with -s" )
281
297
}
282
- serverCCAddr , err := appnet . ResolveUDPAddr ( serverCCAddrStr )
283
- Check (err )
298
+ policy , err := pan . PolicyFromCommandline ( sequence , preference , interactive )
299
+ checkUsageErr (err )
284
300
285
- var path snet.Path
286
- if interactive {
287
- path , err = appnet .ChoosePathInteractive (serverCCAddr .IA )
288
- Check (err )
289
- } else {
290
- var metric int
291
- if pathAlgo == "mtu" {
292
- metric = appnet .MTU
293
- } else if pathAlgo == "shortest" {
294
- metric = appnet .Shortest
295
- }
296
- path , err = appnet .ChoosePathByMetric (metric , serverCCAddr .IA )
297
- Check (err )
298
- }
299
- if path != nil {
300
- appnet .SetPath (serverCCAddr , path )
301
- }
302
-
303
- // use default packet size when within same AS and pathEntry is not set
301
+ // use default packet size when within same AS
304
302
inferedPktSize := int64 (DefaultPktSize )
305
303
// update default packet size to max MTU on the selected path
306
- if path != nil {
304
+ // TODO(matzf): evaluate policy, set pkt size to MTU of most preferred path,
305
+ // append filter to policy to allow only paths with MTU >= pkt size.
306
+ /*if path != nil {
307
307
inferedPktSize = int64(path.Metadata().MTU)
308
- }
308
+ }*/
309
309
if ! flagset ["cs" ] && flagset ["sc" ] { // Only one direction set, used same for reverse
310
310
clientBwpStr = serverBwpStr
311
311
fmt .Println ("Only sc parameter set, using same values for cs" )
312
312
}
313
313
clientBwp , err := parseBwtestParameters (clientBwpStr , inferedPktSize )
314
- Check (err )
314
+ checkUsageErr (err )
315
315
if ! flagset ["sc" ] && flagset ["cs" ] { // Only one direction set, used same for reverse
316
316
serverBwpStr = clientBwpStr
317
317
fmt .Println ("Only cs parameter set, using same values for sc" )
318
318
}
319
319
serverBwp , err := parseBwtestParameters (serverBwpStr , inferedPktSize )
320
- Check (err )
320
+ checkUsageErr (err )
321
321
fmt .Println ("\n Test parameters:" )
322
322
fmt .Printf ("client->server: %d seconds, %d bytes, %d packets\n " ,
323
323
int (clientBwp .BwtestDuration / time .Second ), clientBwp .PacketSize , clientBwp .NumPackets )
324
324
fmt .Printf ("server->client: %d seconds, %d bytes, %d packets\n " ,
325
325
int (serverBwp .BwtestDuration / time .Second ), serverBwp .PacketSize , serverBwp .NumPackets )
326
326
327
- clientRes , serverRes , err := runBwtest (serverCCAddr , clientBwp , serverBwp )
327
+ clientRes , serverRes , err := runBwtest (local . Get (), serverCCAddr , policy , clientBwp , serverBwp )
328
328
Check (err )
329
329
330
330
fmt .Println ("\n S->C results" )
@@ -334,31 +334,29 @@ func main() {
334
334
}
335
335
336
336
// runBwtest runs the bandwidth test with the given parameters against the server at serverCCAddr.
337
- func runBwtest (serverCCAddr * snet .UDPAddr ,
337
+ func runBwtest (local netaddr. IPPort , serverCCAddr pan .UDPAddr , policy pan. Policy ,
338
338
clientBwp , serverBwp BwtestParameters ) (clientRes , serverRes BwtestResult , err error ) {
339
339
340
340
// Control channel connection
341
- ccConn , err := appnet .DialAddr (serverCCAddr )
341
+ ccSelector := pan .NewDefaultSelector ()
342
+ ccConn , err := pan .DialUDP (context .Background (), local , serverCCAddr , policy , ccSelector )
342
343
if err != nil {
343
344
return
344
345
}
345
- clientCCAddr := ccConn .LocalAddr ().(* net.UDPAddr )
346
346
347
- // Address of client data channel (DC)
348
- clientDCAddr := & net.UDPAddr {IP : clientCCAddr .IP , Port : clientCCAddr .Port + 1 }
347
+ dcLocal := local .WithPort (0 )
349
348
// Address of server data channel (DC)
350
- serverDCAddr := serverCCAddr .Copy ()
351
- serverDCAddr .Host .Port = serverCCAddr .Host .Port + 1
352
- // DC ports are passed in the request
353
- clientBwp .Port = uint16 (clientDCAddr .Port )
354
- serverBwp .Port = uint16 (serverDCAddr .Host .Port )
349
+ serverDCAddr := serverCCAddr .WithPort (serverCCAddr .Port + 1 )
355
350
356
351
// Data channel connection
357
- dcConn , err := appnet .DefNetwork ().Dial (
358
- context .TODO (), "udp" , clientDCAddr , serverDCAddr , addr .SvcNone )
352
+ dcConn , err := pan .DialUDP (context .Background (), dcLocal , serverDCAddr , policy , nil )
359
353
if err != nil {
360
354
return
361
355
}
356
+ clientDCAddr := dcConn .LocalAddr ().(pan.UDPAddr )
357
+ // DC ports are passed in the request
358
+ clientBwp .Port = clientDCAddr .Port
359
+ serverBwp .Port = serverDCAddr .Port
362
360
363
361
// Start receiver before even sending the request so it will be ready.
364
362
receiveRes := make (chan BwtestResult , 1 )
@@ -383,6 +381,11 @@ func runBwtest(serverCCAddr *snet.UDPAddr,
383
381
return
384
382
}
385
383
384
+ // Pin DC to path used for request
385
+ if serverDCAddr .IA != clientDCAddr .IA {
386
+ dcConn .SetPolicy (pan.Pinned {ccSelector .Path ().Fingerprint })
387
+ }
388
+
386
389
// Start blasting client->server
387
390
err = HandleDCConnSend (clientBwp , dcConn )
388
391
if err != nil && ! errors .Is (err , os .ErrDeadlineExceeded ) {
0 commit comments