rs_pfcp/lib.rs
1//! # rs-pfcp
2//!
3//! A high-performance Rust implementation of the PFCP (Packet Forwarding Control Protocol)
4//! for 5G networks, providing 100% compliance with 3GPP TS 29.244 Release 18 specification.
5//!
6//! ## What is PFCP?
7//!
8//! PFCP is the critical communication protocol between Control Plane and User Plane functions in 5G networks:
9//! - **SMF (Session Management Function)** ↔ **UPF (User Plane Function)**
10//! - Manages packet forwarding rules, traffic steering, and usage reporting
11//! - Essential for 5G service orchestration, QoS enforcement, and network slicing
12//!
13//! ## Quick Start
14//!
15//! ```rust
16//! # use rs_pfcp::message::session_establishment_request::SessionEstablishmentRequestBuilder;
17//! # use rs_pfcp::message::Message;
18//! # use rs_pfcp::ie::node_id::NodeId;
19//! # use rs_pfcp::ie::fseid::Fseid;
20//! # use rs_pfcp::ie::create_pdr::CreatePdrBuilder;
21//! # use rs_pfcp::ie::create_far::{CreateFar, CreateFarBuilder, FarAction};
22//! # use rs_pfcp::ie::create_qer::CreateQerBuilder;
23//! # use rs_pfcp::ie::f_teid::FteidBuilder;
24//! # use rs_pfcp::ie::pdr_id::PdrId;
25//! # use rs_pfcp::ie::precedence::Precedence;
26//! # use rs_pfcp::ie::pdi::{Pdi, PdiBuilder};
27//! # use rs_pfcp::ie::source_interface::{SourceInterface, SourceInterfaceValue};
28//! # use rs_pfcp::ie::far_id::FarId;
29//! # use rs_pfcp::ie::qer_id::QerId;
30//! # use rs_pfcp::ie::apply_action::ApplyAction;
31//! # use rs_pfcp::ie::{Ie, IeType};
32//! # use std::net::Ipv4Addr;
33//!
34//! // Create F-TEID using new builder pattern
35//! let fteid = FteidBuilder::new()
36//! .teid(0x12345678)
37//! .ipv4("192.168.1.1".parse().unwrap())
38//! .build()
39//! .unwrap();
40//!
41//! // Create QER using new builder pattern for QoS enforcement
42//! let qer = CreateQerBuilder::new(QerId::new(1))
43//! .gate_status(rs_pfcp::ie::gate_status::GateStatus::new(
44//! rs_pfcp::ie::gate_status::GateStatusValue::Open,
45//! rs_pfcp::ie::gate_status::GateStatusValue::Open
46//! ))
47//! .rate_limit(1000000, 2000000) // 1Mbps up, 2Mbps down
48//! .build()
49//! .unwrap();
50//!
51//! // Create session establishment request
52//! # let session_id = 0x1234567890ABCDEF;
53//! # let sequence_number = 1;
54//! # let node_id = NodeId::new_ipv4("10.0.0.1".parse().unwrap());
55//! # let fseid = Fseid::new(0x11111111, None, Some("2001:db8::1".parse().unwrap()));
56//! # let pdi = PdiBuilder::uplink_access()
57//! # .f_teid(fteid.clone())
58//! # .build()
59//! # .unwrap();
60//! # let create_pdr = CreatePdrBuilder::new(PdrId::new(1))
61//! # .precedence(Precedence::new(100))
62//! # .pdi(pdi)
63//! # .far_id(FarId::new(1))
64//! # .build()
65//! # .unwrap();
66//! # let create_far = CreateFar::builder(FarId::new(1))
67//! # .forward_to(rs_pfcp::ie::destination_interface::Interface::Core)
68//! # .build()
69//! # .unwrap();
70//! # let create_qer = CreateQerBuilder::open_gate(QerId::new(1)).build().unwrap();
71//! let request = SessionEstablishmentRequestBuilder::new(session_id, sequence_number)
72//! .node_id(Ipv4Addr::new(10, 0, 0, 1))
73//! .fseid(0x11111111, "2001:db8::1".parse::<std::net::Ipv6Addr>().unwrap())
74//! .create_pdrs(vec![create_pdr.to_ie()])
75//! .create_fars(vec![create_far.to_ie()])
76//! .create_qers(vec![create_qer.to_ie()])
77//! .build()
78//! .unwrap();
79//!
80//! // Serialize to bytes for network transmission
81//! let bytes = request.marshal();
82//!
83//! // Parse received messages
84//! let parsed_msg = rs_pfcp::message::parse(&bytes).unwrap();
85//!
86//! // Convenience methods for common QER patterns
87//! # use rs_pfcp::ie::create_qer::CreateQer;
88//! let open_qer = CreateQer::open_gate(QerId::new(2));
89//! let closed_qer = CreateQer::closed_gate(QerId::new(3));
90//! let rate_limited_qer = CreateQer::with_rate_limit(QerId::new(4), 5000000, 10000000);
91//! let downlink_only_qer = CreateQer::downlink_only(QerId::new(5));
92//! let uplink_only_qer = CreateQer::uplink_only(QerId::new(6));
93//!
94//! // Enhanced FAR builder patterns for traffic forwarding
95//! # use rs_pfcp::ie::bar_id::BarId;
96//! # use rs_pfcp::ie::destination_interface::Interface;
97//! # use rs_pfcp::ie::network_instance::NetworkInstance;
98//!
99//! // Common FAR patterns with validation
100//! let uplink_far = CreateFarBuilder::uplink_to_core(FarId::new(10));
101//! let downlink_far = CreateFarBuilder::downlink_to_access(FarId::new(11));
102//! let drop_far = CreateFarBuilder::drop_traffic(FarId::new(12));
103//! let buffer_far = CreateFarBuilder::buffer_traffic(FarId::new(13), BarId::new(1));
104//!
105//! // Advanced FAR with network instance and validation
106//! let internet_far = CreateFar::builder(FarId::new(14))
107//! .forward_to_network(Interface::Dn, NetworkInstance::new("internet.apn"))
108//! .build()
109//! .unwrap();
110//!
111//! // Forward and duplicate pattern for lawful intercept
112//! let intercept_far = CreateFarBuilder::forward_and_duplicate(FarId::new(15), Interface::Core)
113//! .build()
114//! .unwrap();
115//! # Ok::<(), Box<dyn std::error::Error>>(())
116//! ```
117//!
118//! ## Module Organization
119//!
120//! - [`ie`] - Information Elements (IEs) as defined in 3GPP TS 29.244
121//! - [`message`] - PFCP message types for session and association management
122//! - [`comparison`] - Message comparison tools for testing, debugging, and validation
123
124pub mod comparison;
125pub mod ie;
126pub mod message;