aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-02-23 13:00:52 +0100
committermetamuffin <metamuffin@disroot.org>2025-02-23 13:00:52 +0100
commitc8698d101a202055669c54b18cfa7261e19dcbf2 (patch)
tree67cfb2369c0428525599ae89d4883ce57c95e677
parentbeab67b2e38808f91ecd390190d527fc7db5499d (diff)
downloadsip-rs-c8698d101a202055669c54b18cfa7261e19dcbf2.tar
sip-rs-c8698d101a202055669c54b18cfa7261e19dcbf2.tar.bz2
sip-rs-c8698d101a202055669c54b18cfa7261e19dcbf2.tar.zst
fix race conditionHEADmaster
-rw-r--r--tools/src/main.rs51
1 files changed, 25 insertions, 26 deletions
diff --git a/tools/src/main.rs b/tools/src/main.rs
index c24f366..467b368 100644
--- a/tools/src/main.rs
+++ b/tools/src/main.rs
@@ -1,6 +1,6 @@
#![feature(random)]
use anyhow::Result;
-use log::{info, warn};
+use log::info;
use rtp::{
rtcp::{Application, ReceiverReport, RtcpPacket, RtcpPart, SdesType, SourceDescription},
rtp::SSRC,
@@ -66,17 +66,6 @@ async fn main() -> Result<()> {
};
let tu = Arc::new(TransactionUser::new(transport));
- {
- let tu = tu.clone();
- spawn(async move {
- loop {
- if let Err(e) = tu.process_incoming().await {
- warn!("error processing responses: {e}");
- }
- }
- });
- }
-
let branch = hex::encode([(); 12].map(|()| random::<u8>()));
let call_id = hex::encode([(); 12].map(|()| random::<u8>()));
let tag = hex::encode([(); 12].map(|()| random::<u8>()));
@@ -108,20 +97,32 @@ async fn main() -> Result<()> {
body: String::new(),
};
+ {
+ let tu = tu.clone();
+ let username = username.clone();
+ let handler = move || async move {
+ loop {
+ let req = tu.process_incoming().await?;
+ if req.method == Method::Invite {
+ handle_call(req, tu, local_addr, &username, &self_contact).await?;
+ break;
+ }
+ }
+ anyhow::Ok(())
+ };
+ spawn(async move {
+ if let Err(e) = handler().await {
+ log::error!("handler error: {e:#}")
+ }
+ });
+ }
+
let fail_resp = tu.transact(req.clone()).await?.recv().await.unwrap();
req.headers.insert(Authorization::construct(
&req, &fail_resp, &username, &password,
)?);
let _resp = tu.transact(req.clone()).await?.recv().await.unwrap();
- loop {
- let req = tu.process_incoming().await?;
- if req.method == Method::Invite {
- handle_call(req, tu, local_addr, &username, &self_contact).await?;
- break;
- }
- }
-
ctrl_c().await?;
Ok(())
}
@@ -156,6 +157,7 @@ async fn handle_call(
rtcp_sock.connect(remote_control_addr).await?;
let own_ssrc = SSRC(random());
+ let own_cname = format!("sip:{username}@{local_addr}");
let sess_id = SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
@@ -181,7 +183,7 @@ async fn handle_call(
"rtpmap:101 telephone-event/8000".to_string(),
"fmtp:101 0-15".to_string(),
"sendrecv".to_string(),
- format!("ssrc:{} cname:blub", own_ssrc.0),
+ format!("ssrc:{} cname:{}", own_ssrc.0, &own_cname),
"minptime:20".to_string(),
"ptime:20".to_string(),
"label:1".to_string(),
@@ -226,15 +228,12 @@ async fn handle_call(
reports: vec![],
}),
RtcpPart::SourceDescription(SourceDescription {
- sources: vec![(own_ssrc, vec![(
- SdesType::CanonicalName,
- format!("sip:{username}@{local_addr}"),
- )])],
+ sources: vec![(own_ssrc, vec![(SdesType::CanonicalName, own_cname)])],
}),
RtcpPart::Application(Application {
ssrc: own_ssrc,
subtype: 0,
- name: [b'P', b'I', b'N', b'G'],
+ name: *b"PING",
data: b"PONG",
}),
],