{"id":33933255,"url":"https://github.com/lwlee2608/diameter-rs","last_synced_at":"2026-04-09T00:02:06.803Z","repository":{"id":214964995,"uuid":"737723075","full_name":"lwlee2608/diameter-rs","owner":"lwlee2608","description":"Rust Implementation of the Diameter Protocol","archived":false,"fork":false,"pushed_at":"2025-10-17T09:17:47.000Z","size":236,"stargazers_count":13,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-15T08:41:46.561Z","etag":null,"topics":["4g-network","diameter","protocol","rust","telecom"],"latest_commit_sha":null,"homepage":"https://docs.rs/diameter/latest/diameter/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lwlee2608.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-01-01T08:33:28.000Z","updated_at":"2025-12-03T17:37:06.000Z","dependencies_parsed_at":"2024-02-05T04:32:31.081Z","dependency_job_id":"0b33d16a-fc1e-4366-81d8-2a4fc9b8c076","html_url":"https://github.com/lwlee2608/diameter-rs","commit_stats":null,"previous_names":["lwlee2608/diameter-rs"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/lwlee2608/diameter-rs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lwlee2608%2Fdiameter-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lwlee2608%2Fdiameter-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lwlee2608%2Fdiameter-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lwlee2608%2Fdiameter-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lwlee2608","download_url":"https://codeload.github.com/lwlee2608/diameter-rs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lwlee2608%2Fdiameter-rs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31579058,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["4g-network","diameter","protocol","rust","telecom"],"created_at":"2025-12-12T13:03:11.757Z","updated_at":"2026-04-09T00:02:06.795Z","avatar_url":"https://github.com/lwlee2608.png","language":"Rust","funding_links":[],"categories":["Protocols"],"sub_categories":["Diameter"],"readme":"# Diameter\n\nRust Implementation of the Diameter Protocol.\n\n[![Crates.io][crates-badge]][crates-url]\n[![MIT licensed][mit-badge]][mit-url]\n[![Build Status][actions-badge]][actions-url]\n\n[crates-badge]: https://img.shields.io/crates/v/diameter.svg\n[crates-url]: https://crates.io/crates/diameter\n[mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg\n[mit-url]: LICENSE\n[actions-badge]: https://github.com/lwlee2608/diameter-rs/actions/workflows/build.yml/badge.svg\n[actions-url]: https://github.com/lwlee2608/diameter-rs/actions?query=branch%3Amaster\n\n## Overview\n\nThis library provides a Rust implementation of the Diameter protocol, as defined by [RFC 6733](https://tools.ietf.org/html/rfc6733).\n\n\n\n## Getting Started\n\n### Installation\nAdd this crate to your Rust project by adding the following to your `Cargo.toml`:\n\n```toml\n[dependencies]\ndiameter-rs = \"^0.7\"\n```\n\n\n## Usage\n\n### Diameter Client Example\nBelow is an example of creating a Diameter client that sends a Credit-Control-Request (CCR) message to a server and waits for a response.\n\n\n```rust\nuse diameter::avp::flags::M;\nuse diameter::avp::Enumerated;\nuse diameter::avp::Identity;\nuse diameter::avp::UTF8String;\nuse diameter::avp::Unsigned32;\nuse diameter::dictionary::{self, Dictionary};\nuse diameter::flags;\nuse diameter::transport::DiameterClient;\nuse diameter::transport::DiameterClientConfig;\nuse diameter::{ApplicationId, CommandCode, DiameterMessage};\nuse std::sync::Arc;\n\n#[tokio::main]\nasync fn main() {\n    // Diameter Dictionary\n    let dict = Dictionary::new(\u0026[\u0026dictionary::DEFAULT_DICT_XML]);\n    let dict = Arc::new(dict);\n\n    // Initialize a Diameter client and connect it to the server\n    let client_config = DiameterClientConfig {\n        use_tls: false,\n        verify_cert: false,\n    };\n    let mut client = DiameterClient::new(\"localhost:3868\", client_config);\n    let mut handler = client.connect().await.unwrap();\n    let dict_ref = Arc::clone(\u0026dict);\n    tokio::spawn(async move {\n        DiameterClient::handle(\u0026mut handler, dict_ref).await;\n    });\n\n    // Create a Credit-Control-Request (CCR) Diameter message\n    let mut ccr = DiameterMessage::new(\n        CommandCode::CreditControl,\n        ApplicationId::CreditControl,\n        flags::REQUEST,\n        1123158611,\n        3102381851,\n        dict,\n    );\n    ccr.add_avp(264, None, M, Identity::new(\"host.example.com\").into());\n    ccr.add_avp(296, None, M, Identity::new(\"realm.example.com\").into());\n    ccr.add_avp(263, None, M, UTF8String::new(\"ses;12345888\").into());\n    ccr.add_avp(416, None, M, Enumerated::new(1).into());\n    ccr.add_avp(415, None, M, Unsigned32::new(1000).into());\n\n    // Send the CCR message to the server and wait for a response\n    let response = client.send_message(ccr).await.unwrap();\n    let cca = response.await.unwrap();\n    println!(\"Received response: {}\", cca);\n}\n\n```\n\n\n### Diameter Server Example\nBelow is an example of setting up a Diameter server that listens for incoming requests\n\n```rust\nuse diameter::avp::flags::M;\nuse diameter::avp::Enumerated;\nuse diameter::avp::Identity;\nuse diameter::avp::UTF8String;\nuse diameter::avp::Unsigned32;\nuse diameter::dictionary::{self, Dictionary};\nuse diameter::flags;\nuse diameter::transport::DiameterServer;\nuse diameter::transport::DiameterServerConfig;\nuse diameter::DiameterMessage;\nuse std::sync::Arc;\n\n#[tokio::main]\nasync fn main() {\n    // Diameter Dictionary\n    let dict = Dictionary::new(\u0026[\u0026dictionary::DEFAULT_DICT_XML]);\n    let dict = Arc::new(dict);\n\n    // Set up a Diameter server listening on a specific port\n    let mut server = DiameterServer::new(\"0.0.0.0:3868\", DiameterServerConfig { native_tls: None })\n        .await\n        .unwrap();\n\n    // Asynchronously handle incoming requests to the server\n    let dict_ref = Arc::clone(\u0026dict);\n    server\n        .listen(\n            move |req| {\n                let dict_ref2 = Arc::clone(\u0026dict);\n                async move {\n                    println!(\"Received request: {}\", req);\n\n                    // Create a response message based on the received request\n                    let mut res = DiameterMessage::new(\n                        req.get_command_code(),\n                        req.get_application_id(),\n                        req.get_flags() ^ flags::REQUEST,\n                        req.get_hop_by_hop_id(),\n                        req.get_end_to_end_id(),\n                        dict_ref2,\n                    );\n\n                    // Add various Attribute-Value Pairs (AVPs) to the response\n                    res.add_avp(264, None, M, Identity::new(\"host.example.com\").into());\n                    res.add_avp(296, None, M, Identity::new(\"realm.example.com\").into());\n                    res.add_avp(263, None, M, UTF8String::new(\"ses;123458890\").into());\n                    res.add_avp(416, None, M, Enumerated::new(1).into());\n                    res.add_avp(415, None, M, Unsigned32::new(1000).into());\n                    res.add_avp(268, None, M, Unsigned32::new(2001).into());\n\n                    // Return the response\n                    Ok(res)\n                }\n            },\n            dict_ref,\n        )\n        .await\n        .unwrap();\n}\n```\n\n\n## TLS\n\nBelow are examples of how to set up TLS for both the server and the client.\n\n### Server Configuration with TLS\n```rust\n    let mut cert_file = File::open(\"server.crt\").unwrap();\n    let mut certs = vec![];\n    cert_file.read_to_end(\u0026mut certs).unwrap();\n\n    let mut key_file = File::open(\"server.key\").unwrap();\n    let mut key = vec![];\n    key_file.read_to_end(\u0026mut key).unwrap();\n\n    let pkcs8 = native_tls::Identity::from_pkcs8(\u0026certs, \u0026key).unwrap();\n    let config = DiameterServerConfig {\n        native_tls: Some(pkcs8),\n    };\n```\n\n### Client Configuration with TLS\n```rust\n    let client_config = DiameterClientConfig {\n        use_tls: true,\n        verify_cert: false,\n    };\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flwlee2608%2Fdiameter-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flwlee2608%2Fdiameter-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flwlee2608%2Fdiameter-rs/lists"}