Module scionstack

Module scionstack 

Source
Expand description

§The SCION endhost stack.

ScionStack is a stateful object that is the conceptual equivalent of the TCP/IP-stack found in today’s common operating systems. It is meant to be instantiated once per process.

§Basic Usage

use scion_proto::address::SocketAddr;
use scion_stack::scionstack::{ScionStack, ScionStackBuilder};
use url::Url;

// Create a SCION stack builder
let control_plane_addr: url::Url = "http://127.0.0.1:1234".parse()?;
let builder =
    ScionStackBuilder::new(control_plane_addr).with_auth_token("SNAP token".to_string());

let scion_stack = builder.build().await?;
let socket = scion_stack.bind(None).await?;

// Parse destination address
let destination: SocketAddr = "1-ff00:0:111,[192.168.1.1]:8080".parse()?;

socket.send_to(b"hello", destination).await?;
let mut buffer = [0u8; 1024];
let (len, src) = socket.recv_from(&mut buffer).await?;
println!("Received: {:?} from {:?}", &buffer[..len], src);

§Creating a connected socket.

use scion_proto::address::SocketAddr;
use scion_stack::scionstack::{ScionStack, ScionStackBuilder};
use url::Url;

// Create a SCION stack builder
let control_plane_addr: url::Url = "http://127.0.0.1:1234".parse()?;
let builder =
    ScionStackBuilder::new(control_plane_addr).with_auth_token("SNAP token".to_string());

// Parse destination address
let destination: SocketAddr = "1-ff00:0:111,[192.168.1.1]:8080".parse()?;

let scion_stack = builder.build().await?;
let connected_socket = scion_stack.connect(destination, None).await?;
connected_socket.send(b"hello").await?;
let mut buffer = [0u8; 1024];
let len = connected_socket.recv(&mut buffer).await?;
println!("Received: {:?}", &buffer[..len]);

§Creating a path-unaware socket

use scion_proto::{address::SocketAddr, path::Path};
use scion_stack::scionstack::{ScionStack, ScionStackBuilder};
use url::Url;

// Create a SCION stack builder
let control_plane_addr: url::Url = "http://127.0.0.1:1234".parse()?;
let builder =
    ScionStackBuilder::new(control_plane_addr).with_auth_token("SNAP token".to_string());

// Parse addresses
let bind_addr: SocketAddr = "1-ff00:0:110,[127.0.0.1]:8080".parse()?;
let destination: SocketAddr = "1-ff00:0:111,[127.0.0.1]:9090".parse()?;

// Create a local path for demonstration
let path: scion_proto::path::Path<bytes::Bytes> = Path::local(bind_addr.isd_asn());

let scion_stack = builder.build().await?;
let socket = scion_stack.bind_path_unaware(Some(bind_addr)).await?;
socket
    .send_to_via(b"hello", destination, &path.to_slice_path())
    .await?;
let mut buffer = [0u8; 1024];
let (len, sender) = socket.recv_from(&mut buffer).await?;
println!("Received: {:?} from {:?}", &buffer[..len], sender);

§Advanced Usage

§Custom path selection

// Implement your own path selection logic
use std::sync::Arc;

use bytes::Bytes;
use chrono::{DateTime, Utc};
use scion_proto::{
    address::{IsdAsn, SocketAddr},
    path::Path,
};
use scion_stack::{
    path::manager::PathManager,
    scionstack::{ScionStack, ScionStackBuilder, UdpScionSocket},
    types::ResFut,
};

struct MyCustomPathManager;

impl scion_stack::path::manager::SyncPathManager for MyCustomPathManager {
    fn register_path(
        &self,
        _src: IsdAsn,
        _dst: IsdAsn,
        _now: DateTime<Utc>,
        _path: Path<Bytes>,
    ) {
        // Optionally implement registration logic
    }

    fn try_cached_path(
        &self,
        _src: IsdAsn,
        _dst: IsdAsn,
        _now: DateTime<Utc>,
    ) -> std::io::Result<Option<Path<Bytes>>> {
        todo!()
    }
}

impl scion_stack::path::manager::PathManager for MyCustomPathManager {
    fn path_wait(
        &self,
        src: IsdAsn,
        _dst: IsdAsn,
        _now: DateTime<Utc>,
    ) -> impl ResFut<'_, Path<Bytes>, scion_stack::path::manager::PathWaitError> {
        async move { Ok(Path::local(src)) }
    }
}

// Create a SCION stack builder
let control_plane_addr: url::Url = "http://127.0.0.1:1234".parse()?;
let builder =
    ScionStackBuilder::new(control_plane_addr).with_auth_token("SNAP token".to_string());

// Parse addresses
let bind_addr: SocketAddr = "1-ff00:0:110,[127.0.0.1]:8080".parse()?;
let destination: SocketAddr = "1-ff00:0:111,[127.0.0.1]:9090".parse()?;

let scion_stack = builder.build().await?;
let path_unaware_socket = scion_stack.bind_path_unaware(Some(bind_addr)).await?;
let socket = UdpScionSocket::new(path_unaware_socket, Arc::new(MyCustomPathManager), None);
socket.send_to(b"hello", destination).await?;

Re-exports§

pub use self::builder::ScionStackBuilder;
pub use self::scmp_handler::DefaultScmpHandler;
pub use self::scmp_handler::ScmpHandler;

Modules§

builder
SCION stack builder.
quic
SCION stack QUICK endpoint.
scmp_handler
SCION stack SCMP handler.

Structs§

PathUnawareUdpScionSocket
A path unaware UDP SCION socket.
RawScionSocket
A raw SCION socket.
ScionStack
The SCION stack can be used to create path-aware SCION sockets or even Quic over SCION connections.
ScmpScionSocket
A SCMP SCION socket.
UdpScionSocket
A path aware UDP socket generic over the underlay socket and path manager.

Enums§

NetworkError
Network errors.
ScionSocketBindError
Error return when binding a socket.
ScionSocketReceiveError
SCION socket receive errors.
ScionSocketSendError
SCION socket send errors.
SocketKind
Available kinds of SCION sockets.

Constants§

DEFAULT_RESERVED_TIME
Default duration to reserve a port when binding a socket.