Crate stun_codec

Source
Expand description

Encoders and decoders for STUN (RFC 5389) and its extensions.

§Examples

use bytecodec::{DecodeExt, EncodeExt, Error};
use stun_codec::{Message, MessageClass, MessageDecoder, MessageEncoder, TransactionId};
use stun_codec::rfc5389::{attributes::Software, methods::BINDING, Attribute};

// Creates a message
let mut message = Message::<Attribute>::new(MessageClass::Request, BINDING, TransactionId::new([3; 12]));
message.add_attribute(Software::new("foo".to_owned())?);

// Encodes the message
let mut encoder = MessageEncoder::new();
let bytes = encoder.encode_into_bytes(message.clone())?;
assert_eq!(
    bytes,
    [
        0, 1, 0, 8, 33, 18, 164, 66, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 128, 34, 0, 3,
        102, 111, 111, 0
    ]
);

// Decodes the message
let mut decoder = MessageDecoder::<Attribute>::new();
let decoded = decoder.decode_from_bytes(&bytes)?.map_err(Error::from)?;
assert_eq!(decoded.class(), message.class());
assert_eq!(decoded.method(), message.method());
assert_eq!(decoded.transaction_id(), message.transaction_id());
assert!(decoded.attributes().eq(message.attributes()));

§Define your own attribute enum

By using define_attribute_enums! macro, you can easily define an enum that includes arbitrary attributes.

The following is an example taken from rusturn crate:

#[macro_use] extern crate trackable;

use stun_codec::define_attribute_enums;
use stun_codec::rfc5389::attributes::*;
use stun_codec::rfc5766::attributes::*;

define_attribute_enums!(
    Attribute, AttributeDecoder, AttributeEncoder,
    [
        // RFC 5389
        MappedAddress, Username, MessageIntegrity, ErrorCode,
        UnknownAttributes, Realm, Nonce, XorMappedAddress,
        Software, AlternateServer, Fingerprint,

        // RFC 5766
        ChannelNumber, Lifetime, XorPeerAddress, Data,
        XorRelayAddress, EvenPort, RequestedTransport,
        DontFragment, ReservationToken
    ]
);

§References

Modules§

convert
Conversion traits.
macros
Macros.
net
Socket address related components.
rfc5245
RFC 5245(ICE) specific components.
rfc5389
RFC 5389(STUN) specific components.
rfc5766
RFC 5766(TURN) specific components.
rfc5780
RFC 5780(NAT Behavior Discovery) specific components.
rfc8016
RFC 8016(Mobility with Traversal Using Relays around NAT (TURN)) specific components.
rfc8656
RFC 8656(Traversal Using Relays around NAT (TURN): Relay Extensions to Session Traversal Utilities for NAT (STUN)) specific components.

Macros§

define_attribute_enums
Defines an aggregated attribute type and its decoder and encoder.

Structs§

AttributeType
Attribute type.
BrokenMessage
STUN message of which MessageDecoder could not decode the attribute part.
Message
STUN message.
MessageDecoder
Message decoder.
MessageEncoder
Message encoder.
Method
STUN method.
RawAttribute
An Attribute implementation that has raw value bytes.
RawAttributeDecoder
RawAttribute decoder.
RawAttributeEncoder
RawAttribute encoder.
TransactionId
Transaction ID.

Enums§

MessageClass
The class of a message.

Traits§

Attribute
STUN attribute.

Type Aliases§

DecodedMessage
Message decoded by MessageDecoder.