@@ -34,6 +34,7 @@ struct sip_dialog {
34
34
uint32_t hash ;
35
35
uint32_t lseq ;
36
36
uint32_t rseq ;
37
+ uint32_t lseqinv ;
37
38
size_t cpos ;
38
39
size_t rpos ;
39
40
enum sip_transp tp ;
@@ -395,12 +396,13 @@ int sip_dialog_fork(struct sip_dialog **dlgp, struct sip_dialog *odlg,
395
396
if (!dlg )
396
397
return ENOMEM ;
397
398
398
- dlg -> callid = mem_ref (odlg -> callid );
399
- dlg -> ltag = mem_ref (odlg -> ltag );
400
- dlg -> hash = odlg -> hash ;
401
- dlg -> lseq = odlg -> lseq ;
402
- dlg -> rseq = msg -> req ? msg -> cseq .num : 0 ;
403
- dlg -> tp = msg -> tp ;
399
+ dlg -> callid = mem_ref (odlg -> callid );
400
+ dlg -> ltag = mem_ref (odlg -> ltag );
401
+ dlg -> hash = odlg -> hash ;
402
+ dlg -> lseq = odlg -> lseq ;
403
+ dlg -> lseqinv = odlg -> lseqinv ;
404
+ dlg -> rseq = msg -> req ? msg -> cseq .num : 0 ;
405
+ dlg -> tp = msg -> tp ;
404
406
405
407
err = pl_strdup (& dlg -> uri , & addr .auri );
406
408
if (err )
@@ -570,6 +572,9 @@ int sip_dialog_encode(struct mbuf *mb, struct sip_dialog *dlg, uint32_t cseq,
570
572
if (!mb || !dlg || !met )
571
573
return EINVAL ;
572
574
575
+ if (!strcmp (met , "INVITE" ))
576
+ dlg -> lseqinv = dlg -> lseq ;
577
+
573
578
err |= mbuf_write_mem (mb , mbuf_buf (dlg -> mb ), mbuf_get_left (dlg -> mb ));
574
579
err |= mbuf_printf (mb , "Call-ID: %s\r\n" , dlg -> callid );
575
580
err |= mbuf_printf (mb , "CSeq: %u %s\r\n" , strcmp (met , "ACK" ) ?
@@ -661,6 +666,19 @@ uint32_t sip_dialog_lseq(const struct sip_dialog *dlg)
661
666
}
662
667
663
668
669
+ /**
670
+ * Get the local sequence number of the last sent INVITE
671
+ *
672
+ * @param dlg SIP Dialog
673
+ *
674
+ * @return Local sequence number
675
+ */
676
+ uint32_t sip_dialog_lseqinv (const struct sip_dialog * dlg )
677
+ {
678
+ return dlg ? dlg -> lseqinv : 0 ;
679
+ }
680
+
681
+
664
682
/**
665
683
* Check if a SIP Dialog is established
666
684
*
0 commit comments