14 releases (5 breaking)

0.5.0 Apr 13, 2024
0.4.0 Mar 24, 2024
0.3.3 Mar 14, 2024
0.3.1 Feb 29, 2024
0.0.2 Jan 13, 2024

#1657 in Network programming

Download history 8/week @ 2024-01-07 16/week @ 2024-01-21 5/week @ 2024-01-28 13/week @ 2024-02-04 109/week @ 2024-02-11 72/week @ 2024-02-18 153/week @ 2024-02-25 29/week @ 2024-03-03 225/week @ 2024-03-10 18/week @ 2024-03-17 130/week @ 2024-03-24 31/week @ 2024-03-31 137/week @ 2024-04-07 34/week @ 2024-04-14

335 downloads per month
Used in petrel

MIT license

165KB
4K SLoC

Diameter

Rust Implementation of the Diameter Protocol.

Crates.io MIT licensed Build Status

Reference

Based on RFC 6733

Getting Started

Installation

Add this crate to your Rust project by adding the following to your Cargo.toml:

[dependencies]
diameter-rs = "^0.4"

Diameter Server Example

use diameter::avp;
use diameter::avp::Avp;
use diameter::avp::Enumerated;
use diameter::avp::Identity;
use diameter::avp::Unsigned32;
use diameter::avp::UTF8String;
use diameter::avp::flags::M;
use diameter::Result;
use diameter::transport::DiameterServer;
use diameter::DiameterMessage;
use diameter::flags;

#[tokio::main]
async fn main() {
    // Set up a Diameter server listening on a specific port
    let mut server = DiameterServer::new("0.0.0.0:3868").await.unwrap();

    // Asynchronously handle incoming requests to the server
    server.listen(|req| -> Result<DiameterMessage> {
        println!("Received request: {}", req);

        // Create a response message based on the received request
        let mut res = DiameterMessage::new(
            req.get_command_code(),
            req.get_application_id(),
            req.get_flags() ^ flags::REQUEST,
            req.get_hop_by_hop_id(),
            req.get_end_to_end_id(),
        );

        // Add various Attribute-Value Pairs (AVPs) to the response
        res.add_avp(avp!(264, None, M, Identity::new("host.example.com")));
        res.add_avp(avp!(296, None, M, Identity::new("realm.example.com")));
        res.add_avp(avp!(263, None, M, UTF8String::new("ses;123458890")));
        res.add_avp(avp!(416, None, M, Enumerated::new(1)));
        res.add_avp(avp!(415, None, M, Unsigned32::new(1000)));
        res.add_avp(avp!(268, None, M, Unsigned32::new(2001)));

        // Return the response
        Ok(res)
    }).await.unwrap();
}

Diameter Client Example

use diameter::avp;
use diameter::avp::Avp;
use diameter::avp::Identity;
use diameter::avp::Enumerated;
use diameter::avp::Unsigned32;
use diameter::avp::UTF8String;
use diameter::avp::flags::M;
use diameter::transport::DiameterClient;
use diameter::{ApplicationId, CommandCode, DiameterMessage};
use diameter::flags;

#[tokio::main]
async fn main() {
    // Initialize a Diameter client and connect it to the server
    let mut client = DiameterClient::new("localhost:3868");
    let mut handler = client.connect().await.unwrap();
    tokio::spawn(async move {
        DiameterClient::handle(&mut handler).await;
    });

    // Create a Credit-Control-Request (CCR) Diameter message
    let mut ccr = DiameterMessage::new(
        CommandCode::CreditControl,
        ApplicationId::CreditControl,
        flags::REQUEST,
        1123158611,
        3102381851,
    );
    ccr.add_avp(avp!(264, None, M, Identity::new("host.example.com")));
    ccr.add_avp(avp!(296, None, M, Identity::new("realm.example.com")));
    ccr.add_avp(avp!(263, None, M, UTF8String::new("ses;12345888")));
    ccr.add_avp(avp!(416, None, M, Enumerated::new(1)));
    ccr.add_avp(avp!(415, None, M, Unsigned32::new(1000)));

    // Send the CCR message to the server and wait for a response
    let cca = client.send_message(ccr).await.unwrap();
    println!("Received response: {}", cca);
}

Dependencies

~4–15MB
~193K SLoC