RFC 7315

Private Header (P-Header) Extensions to the Session Initiation Protocol (SIP) for the 3GPP

๐Ÿ“… published July 2014, from ietf

Private Header (P-Header) Extensions to the Session Initiation Protocol (SIP) for the 3GPP โœจ

Okay bestie, this is RFC 7315 ๐ŸŽ€, and it's all about the Private Header (P-Header) Extensions to SIP for the 3GPP. It was published in July 2014 ๐Ÿ’œ and it's an Informational document, which means it's a "here's how it works" doc and not a Standards Track spec. Its ISSN is 2070-1721. It was put together by the IETF (Internet Engineering Task Force) and has three authors: R. Jesske from Deutsche Telekom, K. Drage from Alcatel-Lucent, and C. Holmberg from Ericsson. The Request for Comments number is 7315, and the big headline is that it obsoletes RFC 3455 ๐Ÿฅ€, so 3455 is officially retired and this is the new version.

Abstract ๐Ÿฆ‹

This doc describes a set of private header (P-header) SIP fields that the 3GPP uses ๐Ÿ”ฅ. It also explains where they're applicable, which is only in certain environments. These P-header fields do a bunch of jobs inside the networks the partners run, like charging and telling you which networks a call goes through ๐Ÿ“ก. This document obsoletes RFC 3455.

Status of This Memo ๐Ÿ“œ

Not gonna lie, this part is a little formal, but here's the tea: this document is not an Internet Standards Track specification. It's published just for info ๐Ÿงš.

It's a product of the IETF, and it represents what the IETF community agreed on ๐Ÿซถ. It got public review and was approved by the Internet Engineering Steering Group (IESG). Not every IESG-approved doc is a candidate for any level of Internet Standard, so check Section 2 of RFC 5741 if you want the full story ๐Ÿ’….

If you want the latest status, any errata, or a way to send feedback, go to http://www.rfc-editor.org/info/rfc7315 โœจ.

Copyright (c) 2014 IETF Trust and the persons identified as the document authors. All rights reserved ๐Ÿ’–.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) as they stand on the publication date. Please read these carefully, because they spell out your rights and restrictions for this doc ๐Ÿ“–. Code Components pulled out of this document must include Simplified BSD License text, as described in Section 4.e of the Trust Legal Provisions, and they come with no warranty, as described in the Simplified BSD License โญ.

Table of Contents ๐ŸŒธ

1. Overall Applicability ...........................................3
2. Conventions .....................................................3
3. Overview ........................................................3
4. SIP Private Header Fields .......................................4
   4.1. The P-Associated-URI Header Field ..........................4
        4.1.1. Applicability Statement for the
               P-Associated-URI Header Field .......................5
        4.1.2. Usage of the P-Associated-URI Header Field ..........5
   4.2. The P-Called-Party-ID Header Field .........................6
        4.2.1. Applicability Statement for the
               P-Called-Party-ID Header Field .....................10
        4.2.2. Usage of the P-Called-Party-ID Header Field ........11
   4.3. The P-Visited-Network-ID Header Field .....................12
        4.3.1. Applicability Statement for the
               P-Visited-Network-ID Header Field ..................12
        4.3.2. Usage of the P-Visited-Network-ID Header Field .....13
   4.4. The P-Access-Network-Info Header Field ....................17
        4.4.1. Applicability Statement for the
               P-Access-Network-Info Header Field .................18
        4.4.2. Usage of the P-Access-Network-Info Header ..........18
   4.5. The P-Charging-Function-Addresses Header Field ............19
        4.5.1. Applicability Statement for the
               P-Charging-Function-Addresses Header Field .........20
        4.5.2. Usage of the P-Charging-Function-Addresses
               Header Field .......................................21
   4.6. The P-Charging-Vector Header Field ........................23
        4.6.1. Applicability Statement for the
               P-Charging-Vector Header Field .....................25
        4.6.2. Usage of the P-Charging-Vector Header Field ........25
        4.6.3. Usage of the transit-ioi ...........................27
        4.6.4. Usage of the related-icid ..........................28

5. Formal Syntax ..................................................28
   5.1. P-Associated-URI Header Syntax ............................29
   5.2. P-Called-Party-ID Header Syntax ...........................29
   5.3. P-Visited-Network-ID Header Syntax ........................29
   5.4. P-Access-Network-Info Header Syntax .......................29
   5.5. P-Charging-Function-Addresses Header Syntax ...............31
   5.6. P-Charging-Vector Header Syntax ...........................32
   5.7. New Headers ...............................................33
6. Security Considerations ........................................33
   6.1. P-Associated-URI Header Field .............................33
   6.2. P-Called-Party-ID Header Field ............................34
   6.3. P-Visited-Network-ID Header Field .........................34
   6.4. P-Access-Network-Info Header Field ........................35
   6.5. P-Charging-Function-Addresses Header Field ................36
   6.6. P-Charging-Vector Header Field ............................36
7. IANA Considerations ............................................37
8. Contributors and Acknowledgements ..............................38
9. References .....................................................39
   9.1. Normative References ......................................39
   9.2. Informative References ....................................39
Appendix A. Changes from RFC 3455 .................................41

1. Overall Applicability โœจ

Okay so the SIP extensions in this doc make some assumptions about network topology, how SIP links to the lower layers, and whether trust is transitive ๐Ÿ•ธ๏ธ. These assumptions only work for private networks, and they're NOT appropriate for the Internet at large ๐Ÿ™…โ€โ™€๏ธ. The mechanisms here were built to meet the 3GPP Release 5 requirements on SIP [RFC4083]. They cover cases where either there wasn't a general-purpose solution planned (because there wasn't enough operational experience to know if one was needed), or where a more general solution just isn't mature yet ๐ŸŒฑ. If you want more detail on what's assumed for each extension, check the Applicability subsection for that extension ๐Ÿ’œ.

2. Conventions ๐Ÿ’…

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119] ๐ŸŽ€.

3. Overview ๐Ÿงš

The 3GPP uses SIP to set up and tear down multimedia sessions inside its IP Multimedia Subsystem (IMS) ๐Ÿ“ž. That's described in 3GPP TS 23.228 [TS23.228] and 3GPP TS 24.229 [TS24.229]. RFC 3455 [RFC3455] defines the SIP private header extensions (called P-headers) that the 3GPP spec needs ๐Ÿ”ฅ. The requirements for these extensions are written up in RFC 4083 [RFC4083]. This document obsoletes RFC 3455 [RFC3455], and it also updates the existing P-header descriptions so they cover the extra requirements needed for 3GPP Release 11 ๐ŸŒˆ. Each P-header gets its own section below, so scroll on, bestie ๐Ÿ‘‘.

4. SIP Private Header Fields ๐Ÿฆ‹

4.1. The P-Associated-URI Header Field ๐Ÿ’–

This extension lets a registrar send back a set of associated URIs for a registered SIP address-of-record ๐ŸŒธ. We define the P-Associated-URI header field, which is used in the 200 (OK) response to a REGISTER request. It holds the set of associated URIs tied to the registered address-of-record ๐Ÿ—‚๏ธ.

Besides the address-of-record, an associated URI is a URI that the service provider has given to a user ๐ŸŽŸ๏ธ. A registrar keeps info that lets zero or more URIs be associated with an address-of-record. Usually, all of these URIs (the address-of-record plus the associated ones) are assigned to one particular user ๐Ÿ™‹โ€โ™€๏ธ. This extension lets the User Agent Client (UAC) find out, after a successful authenticated registration, which other URIs (if any) the service provider has tied to the address-of-record URI ๐Ÿ”.

Heads up, though: in standard SIP usage [RFC3261], the registrar does NOT register the associated URIs on the user's behalf ๐Ÿ™…โ€โ™€๏ธ. Only the address-of-record that's in the To header field of the REGISTER gets registered and bound to the contact address. The only thing conveyed is that the registrar knows about other URIs that the same user can use ๐Ÿ’โ€โ™€๏ธ.

It's possible, though, that an application server (or even the registrar itself) registers any of the associated URIs for the user through a third-party registration ๐ŸŒ€. That third-party registration is out of scope for this document, so a UAC MUST NOT assume that the associated URIs are registered ๐Ÿšซ.

If a UAC wants to check whether any associated URI is registered, it can do that with mechanisms specified outside this document. For example, the UA MAY send a REGISTER request with the To header field set to any of the associated URIs and without a Contact header field ๐Ÿ”Ž. The 200 (OK) response will include a Contact header field listing the addresses-of-record that have been registered with contact addresses ๐Ÿ“‹. If the associated URI isn't registered, the UA MAY register it before using it โœจ.

4.1.1. Applicability Statement for the P-Associated-URI Header Field ๐ŸŒท

The P-Associated-URI header field applies in SIP networks where the SIP provider lets a user claim a set of identities (in header fields like the From header field) inside the requests the UA generates ๐Ÿชช. It also assumes the provider knows the whole set of identities a user can legitimately claim, and that the user is fine with limiting their claimed identities to that set ๐ŸŽฏ. This is different from normal SIP usage, where the From header field is explicitly an end-user-specified field ๐Ÿง.

4.1.2. Usage of the P-Associated-URI Header Field ๐Ÿ“

The registrar inserts the P-Associated-URI header field into the 200 (OK) response to a REGISTER request ๐Ÿ“ฌ. The header field value is filled with a list of URIs associated with the address-of-record ๐Ÿ’Œ.

If the registrar supports the P-Associated-URI header field extension and there's at least one associated URI, then the registrar MUST insert the P-Associated-URI header field in ALL the 200 (OK) responses to a REGISTER request ๐Ÿ’ฏ. If there's no P-Associated-URI header field, that means there are no associated URIs for the registered address-of-record ๐ŸŒ™.

4.1.2.1. Procedures at the UA ๐ŸŽ€

okay so a UAC might get a P-Associated-URI header field in the 200 (OK) response to a REGISTER request. If that header shows up there, it means the extension is supported at the registrar ๐Ÿ’…

The header value is a list of one or more associated URIs for the address-of-record. In a later request, the UAC MAY use any of those associated URIs to fill in the From header field value, or any other SIP header field value that says who the calling party is โœจ

The UAC MAY also check whether an associated URI is registered ๐Ÿ” It can do that by putting the URI in the To header field of a REGISTER request sent to the registrar, and leaving out the Contact header field. The 200 (OK) response will then include a Contact header field listing the addresses-of-record that have been registered with contact addresses. As SIP [RFC3261] describes, the 200 (OK) response may contain a Contact header field with zero or more values (zero means the address-of-record is not registered) ๐Ÿ™ˆ

4.1.2.2. Procedures at the Registrar ๐Ÿ‘‘

A registrar that receives and authorizes a REGISTER request MAY associate zero or more URIs with the registered address-of-record ๐Ÿฆ‹

If the address-of-record under registration doesn't have any associated URIs, the P-Associated-URI header field SHALL NOT be included ๐Ÿ’€

Otherwise, a registrar that supports this specification MUST include a P-Associated-URI header field in the 200 (OK) response to a REGISTER request that contains a Contact header. The header field MUST be populated with a comma-separated list of URIs that are associated to the address-of-record under registration ๐Ÿซถ

4.1.2.3. Procedures at the Proxy ๐Ÿงš

This header is not meant for proxies. A proxy doesn't add, read, modify, or delete the header field, so any proxy MUST relay this header field unchanged ๐Ÿ’œ

4.2. The P-Called-Party-ID Header Field ๐ŸŒธ

A proxy server inserts a P-Called-Party-ID header field, usually in an INVITE request, on its way to the destination. The header is filled in with the Request-URI that the proxy received in the request. This tells the User Agent Server (UAS) which address-of-record, out of several registered addresses-of-record, the invitation was sent to. For example, a user might be using one personal SIP URI and one business SIP URI to receive invitations to sessions. The UAS can then play different distinctive audiovisual alerting tones depending on which URI was used to reach it ๐Ÿ””โœจ

Users in the 3GPP IP Multimedia Subsystem (IMS) might get one or several SIP URIs (addresses-of-record) to identify themselves. For example, a user could get one business SIP URI and one personal SIP URI. As an example of how that's used, the user could share the business SIP URI with coworkers and the personal SIP URI with family ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง

At some point, both the business SIP URI and the personal SIP URI are registered with the SIP registrar, so both can receive invitations to new sessions. When the user gets an invitation to join a session, they should be aware of which of the registered SIP URIs the session was sent to ๐Ÿง

This requirement is stated in the 3GPP Release 5 requirements on SIP [RFC4083] ๐Ÿ“œ

The problem shows up on the terminating side of session establishment. At that point, the SIP proxy serving a UA gets an INVITE request. The SIP server retargets the SIP URI in the Request-URI and replaces it with the SIP URI the user published in the Contact header field of the REGISTER request at registration time ๐Ÿ˜ญ

You could argue that the To header field already conveys the semantics of the called user, so this extension to SIP isn't needed. And yes, the To header field can carry the called party ID in most situations. But there are two particular cases where that assumption breaks:

  1. The session has been forwarded, redirected, etc., by previous SIP proxies before it arrives at the proxy serving the called user.
  2. The UAC builds an INVITE request and the To header field is not the same as the Request-URI.

The catch with using the To header field is that the UAC fills it in, and proxies on the path don't modify it. So if the UAC, for any reason, didn't put the address-of-record of the destination user in the To header field, the destination user can't tell which address-of-record the session was meant for ๐Ÿฅบ

Another possible solution is to have the UA give each address-of-record a different Contact header field value when it registers. The UA can tell its registered addresses-of-record apart by assigning each one its own Contact value. For example, when the UA registers the address-of-record sip:id1, the Contact header field value can be sip:id1@ua, while the registration of the address-of-record sip:id2 can be bound to the Contact header field value sip:id2@ua ๐Ÿงฉ

That solution assumes the UA explicitly registers each of its addresses-of-record, so it has full control over the contact address values assigned to each registration ๐Ÿ’…

But if the UA doesn't have full control of its registered addresses-of-record, say because of a third-party registration, the solution falls apart ๐Ÿ’€ That can happen with 3GPP registration. The UA may have already told the network, by means outside of SIP, that some other addresses-of-record should be registered automatically whenever the UA registers a particular address-of-record. The requirement is covered in the 3GPP Release 5 requirements on SIP [RFC4083] ๐Ÿ“œ


Next up, we'll walk through an example of the problem, where some sort of call forwarding happened during the session, so the UAC doesn't know the intended destination URI in the current INVITE request ๐Ÿ•ต๏ธโ€โ™€๏ธ

Say a UA is registering with its proxy (P1) ๐Ÿ“

     Scenario                      UA --- P1

         F1 Register UA -> P1
              REGISTER sip:example.com SIP/2.0
              Via: SIP/2.0/UDP 192.0.2.4:5060;branch=z9hG4bKnashds7
              To: sip:user1-business@example.com
              From: sip:user1-business@example.com;tag=456248
              Call-ID: 843817637684230998sdasdh09
              CSeq: 1826 REGISTER
              Contact: <sip:user1@192.0.2.4>

The user also registers their personal URI with their registrar ๐Ÿ’–

         F2 Register UA -> P1
              REGISTER sip:example.com SIP/2.0
              Via: SIP/2.0/UDP 192.0.2.4:5060;branch=z9hG4bKnashdt8
              To: sip:user1-personal@example.com
              From: sip:user1-personal@example.com;tag=346249
              Call-ID: 2Q3817637684230998sdasdh10
              CSeq: 1827 REGISTER
              Contact: <sip:user1@192.0.2.4>

Later, the proxy/registrar (P1) gets an INVITE request from another proxy (P2) aimed at the user's business SIP address-of-record. This INVITE has been forwarded before, so the To header field doesn't contain the user's SIP URI. In this case, the session was first addressed to sip:other-user@othernetwork.com. The SIP server at othernetwork.com then forwarded it to sip:user1-business@example.com ๐Ÿ”

            Scenario                      UA --- P1 --- P2

         F3 Invite P2 -> P1
              INVITE sip:user1-business@example.com SIP/2.0
              Via: SIP/2.0/UDP 192.0.2.20:5060;branch=z9hG4bK03djaoe1
              To: sip:other-user@othernetwork.com
              From: sip:another-user@anothernetwork.com;tag=938s0
              Call-ID: 843817637684230998sdasdh09
              CSeq: 101 INVITE

Proxy P1 retargets the user and replaces the Request-URI with the SIP URI published at registration time in the Contact header field value ๐ŸŽฏ

         F4 Invite P1 -> UA
              INVITE sip:user1@192.0.2.4 SIP/2.0
              Via: SIP/2.0/UDP 192.0.2.10:5060;branch=z9hG4bKg48sh128
              Via: SIP/2.0/UDP 192.0.2.20:5060;branch=z9hG4bK03djaoe1
              To: sip:other-user@othernetwork.com
              From: sip:another-user@anothernetwork.com;tag=938s0
              Call-ID: 843817637684230998sdasdh09
              CSeq: 101 INVITE

When the UAS gets the INVITE request, it can't tell whether the invitation came from registering the business or the personal address-of-record ๐Ÿ˜ฉ Neither the UAS nor the proxies or application servers can give this user a service based on the destination address-of-record of the session.

We fix this by letting the proxy responsible for the user's home domain (as defined in SIP) insert a P-Called-Party-ID header field that identifies the address-of-record the session is destined for ๐Ÿ› ๏ธ

If this SIP extension is used, the proxy serving the called user gets message flow F5. It then fills the P-Called-Party-ID header field in message flow F6 with the contents of the Request-URI from F4. Flows F5 and F6 are shown below:

         F5 Invite P2 -> P1
              INVITE sip:user1-business@example.com SIP/2.0
              Via: SIP/2.0/UDP 192.0.2.20:5060;branch=z9hG4bK03djaoe1
              To: sip:other-user@othernetwork.com
              From: sip:another-user@anothernetwork.com;tag=938s0
              Call-ID: 843817637684230998sdasdh09
              CSeq: 101 INVITE

         F6 Invite P1 -> UA
              INVITE sip:user1@192.0.2.4 SIP/2.0
              Via: SIP/2.0/UDP 192.0.2.10:5060;branch=z9hG4bKg48sh128
              Via: SIP/2.0/UDP 192.0.2.20:5060;branch=z9hG4bK03djaoe1
              To: sip:other-user@othernetwork.com
              From: sip:another-user@anothernetwork.com;tag=938s0
              Call-ID: 843817637684230998sdasdh09
              P-Called-Party-ID: <sip:user1-business@example.com>
              CSeq: 101 INVITE

When the UA receives INVITE request F6, it can work out the intended address-of-record for the session and apply whatever service that address-of-record needs ๐ŸŽ‰โœจ

4.2.1. Applicability Statement for the P-Called-Party-ID Header Field โœจ

okay so the P-Called-Party-ID header field is for when the UAS needs to know which address-of-record was in the Request-URI before the proxy swaps it for the contact address ๐ŸŽ€ the UAS might want different alerting effects or filtering depending on where the call was meant to go, and this is especially useful when the UAS has registered several addresses-of-record with its registrar. without this extension, the UAS has no idea which address-of-record was in the INVITE by the time it hits its proxy/registrar ๐Ÿ˜ญ

P-Called-Party-ID and History-Info: back when RFC 3455 [RFC3455] was written, History-Info was still a long way from being specified ๐Ÿ’… it has since been specified and approved in RFC 7044 [RFC7044]. it's acknowledged that History-Info gives equivalent coverage to P-Called-Party-ID ๐Ÿซถ but P-Called-Party-ID is used entirely within the 3GPP system and doesn't show up to SIP entities outside a single 3GPP operator ๐Ÿงš

4.2.2. Usage of the P-Called-Party-ID Header Field

the P-Called-Party-ID header field gives proxies and the UAS the address-of-record that was in the Request-URI before a proxy retargets the request ๐Ÿ’œ subsequent proxies on the path or the UAS can use this info ๐Ÿ‘‘

typically, a SIP proxy adds the P-Called-Party-ID header field before retargetting the Request-URI ๐ŸŒธ the value is filled with whatever was in the Request-URI, right before it gets replaced with the contact address โœจ

4.2.2.1. Procedures at the UA

a UAC MUST NOT insert a P-Called-Party-ID header field in any SIP request or response ๐Ÿ™ˆ

a UAS may get a SIP request that has a P-Called-Party-ID header field ๐ŸŽ€ the header will contain the address-of-record the proxy got in the Request-URI, from before it forwarded the request to the UAS ๐Ÿฆ‹

the UAS MAY use the value in the P-Called-Party-ID header field to offer services based on the called party URI ๐Ÿ’… for example, filtering calls by date and time, distinctive presentation services, distinctive alerting tones, and so on ๐Ÿ”ฅ

4.2.2.2. Procedures at the Proxy

a proxy that has access to the user's contact information can insert a P-Called-Party-ID header field into any of the requests indicated in Section 5.7 โœจ when it does, the proxy MUST fill the header value with the contents of the Request-URI in the SIP request it received ๐ŸŒˆ

the proxy that inserts P-Called-Party-ID needs to have info about the user, so that the called party ID doesn't get delivered to the wrong place ๐Ÿ˜ญ that info might, for example, have been learned through a registration process ๐Ÿ“

a proxy or application server that receives a request containing a P-Called-Party-ID header field MAY use the contents of that header to provide a service to the user, based on the URI in the header value ๐Ÿงš

a SIP proxy MUST NOT insert a P-Called-Party-ID header field in REGISTER requests ๐Ÿ’€


4.3. The P-Visited-Network-ID Header Field ๐ŸŒ

okay this one is giving roaming ๐Ÿฆ‹ 3GPP networks are made up of home networks, visited networks, and subscribers ๐Ÿ’– a home network can have roaming agreements with one or more visited networks, which means a mobile terminal that's roaming can use resources from the visited network totally transparently โœจ

one of the conditions for a home network to accept the registration of a UA roaming on a particular visited network is that a roaming agreement exists between the two ๐Ÿค so the home network needs to know which visited network is providing services to the roaming UA ๐Ÿ‘‘

3GPP user agents always register with the home network ๐Ÿ’… the REGISTER request gets proxied by one or more proxies in the visited network on its way to the home network ๐Ÿ›ฃ๏ธ to keep things simple, it makes sense for the visited network to include an identification that the home network already knows ๐Ÿซถ this identification should be globally unique, and it takes the form of a quoted-text string or a token ๐ŸŽ€ the home network can use it to verify that a roaming agreement exists with that visited network, and to authorize the registration through it ๐Ÿ”ฅ

heads up, P-Visited-Network-ID reveals where the user is, down to the coverage area of the visited network ๐Ÿ‘€ for a national network, for example, it would reveal that the user is in that country ๐ŸŒธ

4.3.1. Applicability Statement for the P-Visited-Network-ID Header Field

the P-Visited-Network-ID header field is applicable whenever all of the following circumstances are met ๐Ÿ’œ

  1. there is transitive trust in intermediate proxies between the UA and the home network proxy, through established relationships between the home network and the visited network, backed by standard security mechanisms like IPsec, Authentication and Key Agreement (AKA), or Transport Layer Security (TLS) ๐Ÿ”
  2. an endpoint is using resources provided by one or more visited networks (a network the user doesn't have a direct business relationship with) ๐Ÿงณ
  3. a proxy located in one of the visited networks wants to be identified at the user's home network ๐Ÿ™‹โ€โ™€๏ธ
  4. there's no requirement that every visited network be identified at the home network ๐Ÿ’โ€โ™€๏ธ networks that want to be identified use this extension, and networks that don't want to be identified do nothing ๐Ÿซ 
  5. a commonly pre-agreed text string or token identifies the visited network at the home network ๐Ÿงš
  6. the UAC sends a REGISTER request, a dialog-initiating request (e.g., INVITE request), or a standalone request outside a dialog (e.g., OPTIONS request) to a proxy in a visited network ๐Ÿš€
  7. the request traverses, en route to its destination, a first proxy located in the visited network and a second proxy located in the home network, or its destination is the registrar in the home network ๐Ÿ—บ๏ธ
  8. the registrar or home proxy verifies and authorizes the usage of resources (e.g., proxies) in the visited network ๐Ÿ”ฅ

the P-Visited-Network-ID header field assumes there's a trust relationship between a home network and one or more visited networks it's transited through ๐Ÿค other proxies between the proxy in the visited network that inserts the header and the registrar or home proxy can modify the P-Visited-Network-ID value ๐Ÿ˜ฑ so intermediaries taking part in this mechanism MUST apply a hop-by-hop integrity-protection mechanism, such as IPsec or other available mechanisms, to prevent such attacks ๐Ÿ›ก๏ธ

โš ๏ธ this is serious bestie: without hop-by-hop integrity protection, anyone in the path can mess with the value, so don't skip it ๐Ÿ’€

4.3.2. Usage of the P-Visited-Network-ID Header Field

the P-Visited-Network-ID header field carries the identifier of a visited network to the registrar or home proxy in the home network ๐Ÿ’Œ the identifier is a text string or token that both the registrar or home proxy and the proxies in the visited network know ๐Ÿซถ

typically, the home network authorizes the UA to roam on a particular visited network ๐Ÿ‘‘ that needs an existing roaming agreement between the home and visited networks ๐Ÿ“œ

the home network could try to identify visited networks by looking at the domain names in the Via header fields, but that leans really hard on DNS ๐Ÿ™ƒ a proxy could also fill the Via header field with an IP address, and without a reverse DNS entry, that IP address won't convey the info the home network wants ๐Ÿคทโ€โ™€๏ธ

any SIP proxy in the visited network that receives any of the requests indicated in Section 5.7 MAY insert a P-Visited-Network-ID header field when it forwards the request ๐Ÿฆ‹ if a REGISTER request or other request is crossing different administrative domains (e.g., different visited networks), a SIP proxy MAY insert a new P-Visited-Network-ID header field when the request doesn't already contain one with the same network identifier as its own network ๐ŸŒ (e.g., if the request has gone through other different administrative domains)

heads up, there's no requirement that this header value be readable by the proxies ๐Ÿ‘€ so a first proxy MAY insert an encrypted header field that only the registrar can decrypt ๐Ÿ” if the request goes through a second proxy in the same administrative domain as the first, that second proxy might not be able to read the header's contents ๐Ÿ˜ต in that case, it will think its visited network identifier isn't already in the header value, so it inserts a new P-Visited-Network-ID header field value (hopefully with the same identifier the first proxy inserted, though maybe not encrypted) ๐Ÿซ  when the request reaches the registrar or home proxy, it'll notice the header value is repeated, since both the first and second proxy inserted it ๐Ÿ™ˆ the decrypted values should be the same, because both proxies were part of the same administrative domain ๐Ÿ’– it's not ideal, but it doesn't cause any harm at the registrar or home proxy ๐ŸŒธ

the P-Visited-Network-ID header field is normally used at registration ๐Ÿ’… but this extension doesn't rule out other uses ๐Ÿงš for example, a proxy in a visited network that doesn't keep registration state MAY insert a P-Visited-Network-ID header field into any standalone request outside a dialog, or into a request that creates a dialog ๐ŸŒˆ when this document was written, the only requests that create dialogs were INVITE requests [RFC3261], SUBSCRIBE requests [RFC6665], and REFER requests [RFC3515] ๐Ÿ“ž

as roaming agreements between networks multiply, you have to be careful picking the P-Visited-Network-ID value so it doesn't clash with other identifiers ๐Ÿ™ the identifier MUST be globally unique to avoid duplications ๐Ÿ’Ž there are lots of mechanisms for creating globally unique identifiers across networks, and one of them is already running everywhere: DNS ๐ŸŒ the P-Visited-Network-ID header field has no connection to DNS itself, but its values can be taken from the DNS entry for the network's domain name, which guarantees uniqueness โœจ

4.3.2.1. Procedures at the UA

in the context of the network these header fields apply to, a User Agent has no knowledge of P-Visited-Network-ID when it sends the REGISTER request ๐Ÿ™ˆ so UACs MUST NOT insert a P-Visited-Network-ID header field in any SIP message ๐Ÿซถ

4.3.2.2. Procedures at the Registrar and Proxy โœจ

Okay so a SIP proxy chilling in a visited network MAY insert a P-Visited-Network-ID header field into any of the requests listed in Section 5.7. ๐ŸŒธ When it does, that header field MUST be filled with a text string or a token that names the administrative domain of the network where the proxy is operating, as seen from the user's home network. ๐Ÿฆ‹

A SIP proxy or registrar in the home network can read the P-Visited-Network-ID contents as an identifier for one or more visited networks the request went through. ๐Ÿ’… It may take local-policy-driven actions based on whether a roaming agreement between the home and the visited networks exists (or doesn't exist). So, for instance, whether the request's actions are authorized depends on what's in the P-Visited-Network-ID header field. It's giving policy-based routing energy, bestie ๐Ÿ’œ

A SIP proxy located in the home network MUST delete this header field when it forwards the message outside the home network administrative domain. That's how the user's privacy stays protected ๐Ÿ”’๐Ÿซถ

A SIP proxy located in the home network SHOULD delete this header field when the home proxy has already used its contents, or when the request is routed based on the called party's identification. This applies even when the request is not forwarded outside the home network administrative domain. โœจ

Heads up: a P-Visited-Network-ID that comes in from a UA is not allowed. It MUST be deleted when the request is forwarded. No exceptions, periodt ๐Ÿ™…โ€โ™€๏ธ

4.3.2.3. Examples of Usage

We present an example in the context of the scenario shown in the following network diagram:

  Scenario            UA --- P1 --- P2 --- REGISTRAR

This example shows the message sequence for a REGISTER transaction originating from UA and eventually arriving at the REGISTRAR. ๐Ÿงš P1 is an outbound proxy in the visited network for UA. In this case, P1 inserts the P-Visited-Network-ID header field. Then P1 routes the REGISTER request to REGISTRAR via P2. Main character routing, fr fr ๐Ÿ‘‘

Message sequence for REGISTER using the P-Visited-Network-ID header field:

      F1 Register UA -> P1
           REGISTER sip:example.com SIP/2.0
           Via: SIP/2.0/UDP 192.0.2.4:5060;branch=z9hG4bKnashds7
           To: sip:user1-business@example.com
           From: sip:user1-business@example.com;tag=456248
           Call-ID: 843817637684230998sdasdh09
           CSeq: 1826 REGISTER
           Contact: <sip:user1@192.0.2.4>

In flow F2, proxy P1 adds its own identifier, in a quoted string, to the P-Visited-Network-ID header field. ๐ŸŽ€

      F2 Register P1 -> P2
           REGISTER sip:example.com SIP/2.0
           Via: SIP/2.0/UDP p1@visited.net;branch=z9hG4bK203igld
           Via: SIP/2.0/UDP 192.0.2.4:5060;branch=z9hG4bKnashd8
           To: sip:user1-personal@example.com
           From: sip:user1-personal@example.com;tag=346249
           Call-ID: 2Q3817637684230998sdasdh10
           CSeq: 1826 REGISTER
           Contact: <sip:user1@192.0.2.4>
           P-Visited-Network-ID: "Visited network number 1"

Finally, in flow F3, proxy P2 decides to insert its own identifier, derived from its own domain name, into the P-Visited-Network-ID header field. Iconic energy ๐ŸŒˆ

      F3 Register P2 -> REGISTRAR
           REGISTER sip:example.com SIP/2.0
           Via: SIP/2.0/UDP p2@other.net;branch=z9hG4bK2bndnvk
           Via: SIP/2.0/UDP p1@visited.net;branch=z9hG4bK203igld
           Via: SIP/2.0/UDP 192.0.2.4:5060;branch=z9hG4bKnashd8
           To: sip:user1-personal@example.com
           From: sip:user1-personal@example.com;tag=346249
           Call-ID: 2Q3817637684230998sdasdh10
           CSeq: 1826 REGISTER
           Contact: <sip:user1@192.0.2.4>
           P-Visited-Network-ID: other.net,"Visited network number 1"

4.4. The P-Access-Network-Info Header Field

This section describes the P-Access-Network-Info header field. ๐Ÿ“ก It's useful in SIP-based networks that also provide Layer 2 (L2) / Layer 3 (L3) connectivity through different access technologies. SIP UAs may use this header field to relay information about the access technology to the proxies that are providing services. The serving proxy can then use that information to optimize services for the UA. For example, a 3GPP UA may use this header field to pass information about the access network, such as the radio access technology and radio cell identity, to its home service provider. ๐Ÿ›ฐ๏ธโœจ

For the purpose of this extension, we define an access network as the network providing the L2/L3 IP connectivity. That network, in turn, gives a user access to the SIP capabilities and services provided. ๐Ÿงƒ

Sometimes the SIP server that provides the user with services wants to know the type of access network the UA is currently using. Some services are more or less suitable depending on the access type, and some services are more valuable to subscribers when the access network details are known by the SIP proxy providing those services. ๐Ÿ’–

In other cases, the SIP server that provides the user with services may just want crude location information so it can provide certain services. For example, many location-based services available in wireless networks today require the home network to know the identity of the cell the user is being served by. ๐Ÿ“

Some regulatory requirements mandate that, for cellular radio systems, the identity of the cell where an emergency call is established be made available to the emergency authorities. ๐Ÿšจ That's a serious one, babe.

The SIP server that provides services to the user may want knowledge about the access network. This is achieved by defining a new private SIP extension header field, the P-Access-Network-Info header field. This header field carries information about the access network between the UAC and its serving proxy in the home network. ๐ŸŽ€

A proxy providing services based on the P-Access-Network-Info header field MUST consider the trust relationship to the UA or outbound proxy that includes the P-Access-Network-Info header field.

Wait, let me fix that: the original says "must consider", which is lowercase, so it isn't a BCP 14 keyword and I shouldn't capitalise it. Correcting the line below:

A proxy providing services based on the P-Access-Network-Info header field must consider the trust relationship to the UA or outbound proxy including the P-Access-Network-Info header field. ๐Ÿค

4.4.1. Applicability Statement for the P-Access-Network-Info Header Field

This mechanism is appropriate in environments where SIP services depend on SIP elements knowing details about the IP and lower-layer technologies a UA uses to connect to the SIP network. ๐Ÿ” Specifically, the extension requires that the UA know the access technology it is using, and that a proxy wants that information to provide services. Generally, SIP is built on the "everything over IP and IP over everything" principle, where the access technology is not relevant for SIP operation. Since SIP systems generally should not care or even know about the access technology, this SIP extension is not for general SIP usage. ๐Ÿ™ˆ

The information revealed in the P-Access-Network-Info header field is potentially very sensitive. ๐Ÿ˜ญ Proper protection of this information depends on specific business and security relationships among the proxies that will see SIP messages containing this header field. It also depends on the UA having explicit knowledge of those relationships. Therefore, this mechanism is only suitable in environments where the appropriate relationships are in place and the UA has explicit knowledge that they exist. Security is the whole vibe here, no cap ๐Ÿ”

4.4.2. Usage of the P-Access-Network-Info Header

When a UA generates a SIP request or response that it knows is going to be securely sent to its SIP proxy providing services, the UA inserts a P-Access-Network-Info header field into the SIP message. ๐Ÿ’Œ This header contains information on the access network the UA is using to get IP connectivity. The header is typically ignored by intermediate proxies between the UA and the SIP proxy providing services. The proxy providing services can inspect the header and use the information in it to provide appropriate services, depending on the value of the header. Before proxying the request onwards to an untrusted administrative network domain, this proxy strips the header from the message. ๐Ÿงน

Additionally, the first outbound proxy, if it has appropriate information, can also add a P-Access-Network-Info header field with its own information. ๐ŸŒท

4.4.2.1. UA Behavior

A UA that supports this extension and is willing to disclose the related parameters MAY insert the P-Access-Network-Info header field in any SIP request or response. ๐Ÿ’โ€โ™€๏ธ

The UA inserting this information MUST have a trust relationship with the proxy providing services, so it can protect its privacy by deleting the header before forwarding the message outside of that proxy's domain. This proxy is typically located in the home network. ๐Ÿ 

In order to avoid the deletion of the header, there MUST also be a transitive trust in the intermediate proxies between the UA and the proxy that provides the services. This trust is established by business agreements between the home network and the access network, and is generally supported by standard security mechanisms, e.g., IPsec, AKA, and TLS. ๐Ÿ”๐Ÿ’œ

4.4.2.2. Proxy Behavior

A proxy MUST NOT modify the value of the P-Access-Network-Info header field. ๐Ÿ™…โ€โ™€๏ธ

A proxy that has appropriate information about the access technology MAY insert a P-Access-Network-Info header field with its own values. A proxy sending towards an untrusted entity MUST remove any P-Access-Network-Info header field containing a "network-provided" value. ๐Ÿงผ

A proxy providing services to the UA can act upon any information present in the P-Access-Network-Info header field value, if it is present, to provide a different service depending on the network or the location through which the UA is accessing the server. ๐Ÿ—บ๏ธ For example, for cellular radio access networks, the SIP proxy located in the home network MAY use the cell ID to provide basic localized services.

A proxy that provides services to the user is typically located in the home network and is therefore trusted. It MUST delete the header when the SIP signaling is forwarded to a SIP server located in an untrusted administrative network domain. The SIP server providing services to the UA uses the access network information, which is of no interest to other proxies located in different administrative domains. ๐ŸŒธ

4.5. The P-Charging-Function-Addresses Header Field โœจ

okay so 3GPP built this super distributed architecture ๐ŸŒธ where a bunch of network entities end up helping deliver access and services. the thing is, every SIP proxy in a transaction needs to know which common charging functional entities should receive the charging records or charging events. it's a whole group project ๐Ÿ’…

3GPP's answer is two kinds of charging functional entities: the Charging Collection Function (CCF) and the Event Charging Function (ECF). the CCF handles offline charging (think postpaid accounts ๐Ÿ’ณ), and the ECF handles online charging (think prepaid accounts โœจ). a network can have more than one CCF and ECF instance for redundancy, which is so smart ๐Ÿซถ. when there's more than one instance, implementations SHOULD try sending the charging data to the ECF or CCF address, starting with the first address in the sequence (if there is one) in the P-Charging-Function-Addresses header field. if that first address isn't available, then the next one (ccf-2 or ecf-2) MUST be used, if it's available. the CCF and ECF addresses MAY be passed during the establishment of a dialog or in a standalone transaction. for more juicy charging details, check out 3GPP TS 32.240 [TS32.240] and 3GPP TS 32.260 [TS32.260] ๐Ÿ“š

we're defining the SIP private header field called P-Charging-Function-Addresses ๐ŸŽ€. a proxy MAY add this header, if it isn't already there, to either the initial request or response for a dialog, or to the request and response of a standalone transaction outside a dialog. when it's present, only one instance of the header MUST be present in a particular request or response. main character energy, one header only ๐Ÿ‘‘

how a SIP proxy gathers the values to fill in this header is outside the scope of this document ๐Ÿ™ˆ. but as an example, a SIP proxy might have these addresses preconfigured, or it could grab them from a subscriber database ๐Ÿ—‚๏ธ.

4.5.1. Applicability Statement for the P-Charging-Function-Addresses Header Field ๐ŸŒˆ

this header is applicable within a single private administrative domain where charging coordination is needed, like under the architecture in 3GPP TS 32.240 [TS32.240] ๐Ÿฆ‹.

the P-Charging-Function-Addresses header field is not included in a SIP message sent outside of the own administrative domain ๐Ÿšซ. and it's not applicable if the administrative domain doesn't provide a charging function.

it's applicable whenever these circumstances are met:

  1. A UA sends a REGISTER or dialog-initiating request (e.g., INVITE request) or a standalone transaction request outside a dialog to a proxy located in the administrative domain of a private network.
  2. A registrar, proxy, or UA that is located in the administrative domain of the private network wants to generate charging records.
  3. A registrar, proxy, or UA that is located in the private network has access to the addresses of the charging function entities for that network.
  4. There are other proxies that are located in the same administrative domain of the private network and that generate charging records or charging events. The proxies want to send, by means outside SIP, the charging information to the same charging collecting entities than the first proxy.

4.5.2. Usage of the P-Charging-Function-Addresses Header Field ๐Ÿง

a SIP proxy that receives a SIP request MAY insert a P-Charging-Function-Addresses header field before forwarding the request, if the header wasn't already there. the header field holds one or more parameters with the hostnames or IP addresses of the nodes that are willing to receive charging information ๐Ÿ“ฌ.

a SIP proxy that receives a request with a P-Charging-Function-Addresses header field can use those hostnames or IP addresses as the destination for charging information or charging events ๐ŸŽฏ. the means of actually sending that info are outside the scope of this document, and they usually don't use SIP for that purpose ๐Ÿ“ฎ.

4.5.2.1. Procedures at the UA ๐Ÿ’–

this document doesn't specify any procedure at a UA located outside the administrative domain of a private network when it comes to the P-Charging-Function-Addresses header field. those UAs need not understand this header ๐Ÿ˜Œ.

however, it might be possible that a UA is located within the administrative domain of a private network (e.g., a Public Switched Telephone Network (PSTN) gateway, or conference mixer), and it may have access to the addresses of the charging entities ๐ŸŽ™๏ธ. in this case, a UA MAY insert the P-Charging-Function-Addresses header field in a SIP request or response when the next hop for the message is a proxy or UA located in the same administrative domain. similarly, such a UA MAY use the contents of the header field when communicating with the charging entities ๐Ÿซถ.

4.5.2.2. Procedures at the Proxy ๐Ÿ”ฅ

a SIP proxy that supports this extension and receives a request or response without the P-Charging-Function-Addresses header field MAY insert one before forwarding the message ๐Ÿ› ๏ธ. the header gets populated with a list of the addresses of one or more charging entities where the proxy should send charging-related information.

if a proxy that supports this extension receives a request or response with the P-Charging-Function-Addresses header field, it MAY pull the info out of the header to use with application-specific logic, i.e., charging ๐Ÿ’…. if the next hop for the message is within the proxy's administrative domain, then the proxy SHOULD include the header field in the outbound message. however, if the next hop is outside the proxy's administrative domain, then the proxy MUST remove the P-Charging-Function-Addresses header field ๐Ÿšช. no leaking the charging addresses to strangers, bestie ๐Ÿ™…โ€โ™€๏ธ.

4.5.2.3. Examples of Usage ๐Ÿงš

we'll walk through an example using this network scenario:

      Scenario                   UA1 --- P1 --- P2 --- UA2

in this scenario, we assume that P1 and P2 belong to the same administrative domain ๐Ÿ .

the example below shows the message sequence for an INVITE transaction that starts at UA1 and eventually arrives at UA2 โœˆ๏ธ. P1 is an outbound proxy for UA1, so in this case P1 inserts charging information. then P1 routes the request via P2 to UA2.

Message sequence for INVITE using P-Charging-Function-Addresses header field:

F1 Invite UA1 -> P1
   INVITE sip:ua2@home1.net SIP/2.0
   Via: SIP/2.0/UDP 192.0.2.4:5060;branch=z9hG4bKnashds7
   To: sip:ua2@home1.net
   From: sip:ua1@home1.net;tag=456248
   Call-ID: 843817637684230998sdasdh09
   CSeq: 18 INVITE
   Contact: sip:ua1@192.0.2.4

F2 Invite P1 -> P2
   INVITE sip:ua2@home1.net SIP/2.0
   Via: SIP/2.0/UDP p1@home1.net:5060;branch=z9hG4bK34ghi7ab04
   Via: SIP/2.0/UDP 192.0.2.4:5060;branch=z9hG4bKnashds7
   To: sip:ua2@home1.net
   From: sip:ua1@home1.net;tag=456248
   Call-ID: 843817637684230998sdasdh09
   CSeq: 18 INVITE
   Contact: sip:ua1@192.0.2.4
   P-Charging-Function-Addresses:
                            ccf=192.0.8.1; ecf=192.0.8.3,
                            ccf-2=192.0.8.2; ecf-2=192.0.8.4

now both P1 and P2 know the IP addresses of the entities that collect charging records or charging events ๐Ÿฅณ. both proxies can send the charging information to the same entities, and that's the vibe we want ๐Ÿ’œ.

4.6. The P-Charging-Vector Header Field ๐ŸŒธ

3GPP's distributed architecture means multiple network entities are involved in providing access and services ๐ŸŒ. operators need the ability and flexibility to charge for that access and those services however they see fit ๐Ÿ’ธ. this requires coordination among the network entities (e.g., SIP proxies), and that includes correlating the charging records generated by different entities that relate to the same session ๐Ÿ”—.

the correlation information includes, but isn't limited to, a globally unique charging identifier, which makes the billing effort so much easier ๐Ÿงพ.

a charging vector is defined as a collection of charging information ๐ŸŽ. the charging vector MAY be filled in during the establishment of a dialog or in a standalone transaction outside a dialog. the information inside the charging vector MAY be filled in by multiple network entities (including SIP proxies) and retrieved by multiple network entities too ๐Ÿค. there are three types of correlation information being transferred: the IMS Charging Identity (ICID) value, the address of the SIP proxy that creates the ICID value, and the Inter Operator Identifier (IOI) ๐Ÿฆ‹.

the ICID is a charging value that identifies a dialog or a transaction outside a dialog, and it's used to correlate charging records ๐Ÿ”. ICID MUST be a globally unique value. one way to get there is to generate the ICID from two components: a locally unique value and the hostname or IP address of the SIP proxy that generated that locally unique value ๐Ÿงฉ.

the IOI identifies both the originating and terminating networks involved in a SIP dialog or a transaction outside a dialog ๐Ÿ›ซ๐Ÿ›ฌ. there MAY be an IOI generated from each side of the dialog, so each side's network gets identified ๐Ÿชช.

in a multi-network environment, one or more transit IOI identifiers MAY be included along the path of the SIP dialog or transaction outside a dialog ๐Ÿ›ค๏ธ. due to network policy, a void value MAY be included instead of the transit network name. the void value says "a transit network showed up, but the operator policy means its name isn't shown" ๐Ÿค.

and in a multi-service provider environment, one or more transit IOIs MAY be included along the path of the SIP dialog or transaction outside a dialog ๐ŸŒ. due to service provider policy, a void value MAY be included instead of the transit service provider. same deal here: the void value means a transit appeared, but the service provider name isn't shown because of service provider policy ๐Ÿ™ˆ.

there's also expected to be access network charging information, which consists of network-specific identifiers for the access level (e.g., Universal Mobile Telecommunications System (UMTS) radio access network or IEEE 802.11b) ๐Ÿ“ก. the details for each type of network aren't described in this memo, so that's a separate story ๐Ÿ“–.

we're defining the SIP private header P-Charging-Vector header field ๐Ÿ’ซ. a proxy MAY include this header, if it isn't already present, in either the initial request or response for a dialog, or in the request and response of a standalone transaction outside a dialog. when it's present, only one instance of the header MUST be present in a particular request or response ๐Ÿ‘‘.

the mechanisms by which a SIP proxy collects the values to populate the P-Charging-Vector header field are outside the scope of this document ๐Ÿซ .

4.6.1. Applicability Statement for the P-Charging-Vector Header Field ๐ŸŽ€

okay so the P-Charging-Vector header is giving "only trusted friends allowed" ๐Ÿซถ It works inside one private admin domain, or between different domains that have a trust relationship with each other. ๐Ÿ”’

If there's no trust relationship, the header is NOT included in a SIP message sent to another network ๐Ÿ’€ (no cap, that's the rule). It also isn't applicable when the admin domain handles charging without needing to correlate records from several network entities (for example, SIP proxies). Why would you even need it then? ๐Ÿ™ˆ

The P-Charging-Vector header is applicable whenever these circumstances are met:

  1. A UA sends a REGISTER or dialog-initiating request (for example, INVITE), a mid-dialog request (for example, UPDATE), or a standalone transaction request outside a dialog to a proxy in the administrative domain of a private network. ๐Ÿ“จ
  2. A registrar, proxy, or UA in the administrative domain of the private network wants to generate charging records. ๐Ÿ’…
  3. A proxy or UA in the administrative domain of the private network has access to the charging correlation information for that network. ๐Ÿงš
  4. Optionally, a registrar, proxy, or UA that's part of a second administrative domain in another private network, whose SIP requests and responses travel through the first private network on their way to or from it, wants to generate charging records and correlate those with the records of the first private network. This assumes there's a trust relationship between both private networks. ๐Ÿ‘‘

4.6.2. Usage of the P-Charging-Vector Header Field ๐Ÿฆ‹

The P-Charging-Vector header is used to carry charging-related info, like the globally unique IMS Charging Identity (ICID) value. โœจ

Typically, a SIP proxy that gets a SIP request without a P-Charging-Vector header MAY insert one, using whatever parameters it has available. ๐ŸŒธ

A SIP proxy that gets a SIP request WITH a P-Charging-Vector header can use the values, like the globally unique ICID, to produce charging records. ๐Ÿ“Š

4.6.2.1. Procedures at the UA ๐Ÿ’–

This document doesn't specify any procedure for a UA that sits outside the administrative domain of a private network (like a PSTN gateway or a conference mixer) when it comes to the P-Charging-Vector header. UAs need not understand this header. ๐Ÿ™ƒ

BUT it might be possible for a UA to be inside the administrative domain of a private network (like a PSTN gateway or conference mixer), and then it may interact with the charging entities. ๐Ÿซฃ In that case, a UA MAY insert the P-Charging-Vector header in a SIP request or response when the next hop is a proxy or UA in the same administrative domain. Similarly, that UA MAY use the contents of the P-Charging-Vector header when talking to the charging entities. ๐Ÿ’œ

4.6.2.2. Procedures at the Proxy ๐Ÿ“

A SIP proxy that supports this extension and receives a request or response without the P-Charging-Vector header MAY insert a P-Charging-Vector header before forwarding the message. The header gets filled with one or more parameters, as described in the syntax, including (but not limited to) a globally unique charging identifier. โœจ

If a proxy that supports this extension gets a request or response WITH the P-Charging-Vector header, it MAY pull the info out of the header value to use with application-specific logic, aka charging. ๐Ÿ”ฅ If the next hop is inside the trusted domain, then the proxy SHOULD include the P-Charging-Vector header in the outbound message. If the next hop is outside the trusted domain, then the proxy MAY remove the P-Charging-Function-Addresses header field. ๐Ÿ™ˆ

Per its own local application-specific logic, the proxy MAY modify the contents of the P-Charging-Vector header before sending the message. ๐ŸŒˆ

4.6.2.3. Examples of Usage ๐Ÿงšโ€โ™€๏ธ

We're going to look at an example in the scenario shown in this network diagram:

 Scenario                      UA1 --- P1 --- P2 --- UA2

This example shows the message sequence for an INVITE transaction that starts at UA1 and eventually reaches UA2. P1 is the outbound proxy for UA1, so P1 inserts the charging info. Then P1 routes the call through P2 to UA2. ๐Ÿ“ž

Message sequence for INVITE using the P-Charging-Vector header field:

     F1 Invite UA1 -> P1
          INVITE sip:joe@example.com SIP/2.0
          Via: SIP/2.0/UDP 192.0.2.4:5060;branch=z9hG4bKnashds7
          To: sip:joe@example.com
          From: sip:ua1@home1.net;tag=456248
          Call-ID: 843817637684230998sdasdh09
          CSeq: 18 INVITE
          Contact: sip:ua1@192.0.2.4

     F2 Invite P1 -> P2
          INVITE sip:joe@example.com SIP/2.0
          Via: SIP/2.0/UDP P1@home1.net:5060;branch=z9hG4bK34ghi7a
          Via: SIP/2.0/UDP 192.0.2.4:5060;branch=z9hG4bKnashds7
          To: sip:joe@example.com
          From: sip:ua1@home1.net;tag=456248
          Call-ID: 843817637684230998sdasdh09
          CSeq: 18 INVITE
          Contact: sip:ua1@192.0.2.4
          P-Charging-Vector: icid-value=1234bc9876e;
                             icid-generated-at=192.0.6.8;
                             orig-ioi=home1.net

4.6.3. Usage of the transit-ioi ๐ŸŒ

The transit-ioi gets added to the P-Charging-Vector header when traffic goes through transit networks. You can have multiple transit-ioi values in one SIP message or response, and the values in the response are independent of the ones set up in the request. ๐Ÿ’ซ

The element can be added either by a transit network itself, or by the next network at the entry point where the previous network is known. Depending on network policy, a void value can be used. ๐Ÿซง

Depending on the call scenario, each transit network can add either a transit network name or a void value. However, it can't be guaranteed that all the values that get added will show up in the P-Charging-Vector header. ๐Ÿฅฒ

Some networks can screen the P-Charging-Vector header and delete transit-ioi values, for example networks that don't support this value. There are scenarios where the transit-ioi values from all networks need to appear to get a correct end-to-end view. ๐Ÿ‘€

The policies for adding, modifying, and deleting transit-ioi values are out of scope for this document. ๐Ÿ“

The transit-ioi contains an indexed value that MUST be incremented with each value added to the P-Charging-Vector header. ๐Ÿ”ข

A void value has no index. When you add the next value, the index has to go up by the number of void entries +1. ๐Ÿงฎ

4.6.3.1. Procedures at the Proxy ๐Ÿฃ

The procedures in Section 4.5.2.2 apply here. A transit-ioi MAY be added or modified by a proxy. A deletion of the transit-ioi, or of an entry within the transit-ioi, could show up depending on network policy and trust rules. This is also valid when you replace the transit-ioi with a void value. ๐Ÿซถ

4.6.4.1. Procedures at the UA ๐ŸŒŸ

The UAS acting as a B2BUA MAY add the related-icid into the P-Charging-Vector header in SIP requests or SIP responses. For example, the UAS can include the related-icid in a response to an INVITE request when the INVITE it received creates a new call leg toward the same remote end. The value of the related-icid is the icid value of the original dialog toward the remote end. ๐Ÿ’…

4.6.4.2. Procedures at the Proxy โœจ

The procedures in Section 4.5.2.2 apply here. A related-icid and "related-icid-generated-at" MAY be added or modified by a proxy. A deletion of these elements could show up depending on network policy and trust rules. ๐Ÿ™Œ

5. Formal Syntax ๐Ÿ“œ

All of the mechanisms specified in this document are described in both prose and an augmented Backus-Naur Form (BNF) defined in RFC 5234 [RFC5234]. Several BNF definitions are inherited from SIP and aren't repeated here, so implementors need to be familiar with the notation and contents of SIP [RFC3261] and [RFC5234] to understand this document. ๐Ÿค“

5.1. P-Associated-URI Header Syntax ๐ŸŽ€

The syntax of the P-Associated-URI header field goes like this:

      P-Associated-URI       = "P-Associated-URI" HCOLON
                               [p-aso-uri-spec]
                               *(COMMA p-aso-uri-spec)
      p-aso-uri-spec         = name-addr *(SEMI ai-param)
      ai-param               = generic-param

5.2. P-Called-Party-ID Header Syntax ๐Ÿฆ‹

The syntax of the P-Called-Party-ID header field goes like this:

      P-Called-Party-ID      = "P-Called-Party-ID" HCOLON
                               called-pty-id-spec
      called-pty-id-spec     = name-addr *(SEMI cpid-param)
      cpid-param             = generic-param

5.3. P-Visited-Network-ID Header Syntax ๐ŸŒธ

The syntax of the P-Visited-Network-ID header field goes like this:

      P-Visited-Network-ID   = "P-Visited-Network-ID" HCOLON
                                vnetwork-spec
                                *(COMMA vnetwork-spec)
      vnetwork-spec          = (token / quoted-string)
                                *(SEMI vnetwork-param)
      vnetwork-param         = generic-param

5.4. P-Access-Network-Info Header Syntax โœจ

Okay, so here's the grammar for the P-Access-Network-Info header field ๐Ÿ›œ Everything hangs off access-net-spec, and it's giving very precise. ๐Ÿ’…

      P-Access-Network-Info  = "P-Access-Network-Info" HCOLON
                                access-net-spec *(COMMA access-net-spec)
      access-net-spec        = (access-type / access-class)
                               *(SEMI access-info)
      access-type            = "IEEE-802.11" / "IEEE-802.11a" /
                               "IEEE-802.11b" / "IEEE-802.11g" /
                               "IEEE-802.11n" /
                               "IEEE-802.3" / "IEEE-802.3a" /
                               "IEEE-802.3ab" / "IEEE-802.3ae" /
                               "IEEE-802.3ak" / "IEEE-802.3ah" /
                               "IEEE-802.3aq" / "IEEE-802.3an" /
                               "IEEE-802.3e" / "IEEE-802.3i" /
                               "IEEE-802.3j" / "IEEE-802.3u" /
                               "IEEE-802.3y" / "IEEE-802.3z" /
                               "3GPP-GERAN" /
                               "3GPP-UTRAN-FDD" / "3GPP-UTRAN-TDD" /
                               "3GPP-E-UTRAN-FDD" / "3GPP-E-UTRAN-TDD" /
                               "3GPP2-1X-Femto" / "3GPP2-UMB" /
                               "3GPP2-1X-HRPD" / "3GPP2-1X" /
                               "ADSL" / "ADSL2" / "ADSL2+" / "RADSL" /
                               "SDSL" / "HDSL" / "HDSL2" / "G.SHDSL" /
                               "VDSL" / "IDSL" /
                               "DOCSIS" / "GSTN" / "GPON" / " XGPON1" /
                               "DVB-RCS2" / token
      access-class           = "3GPP-GERAN" /  "3GPP-UTRAN" /
                               "3GPP-E-UTRAN" / "3GPP-WLAN" /
                               "3GPP-GAN" / "3GPP-HSPA" /
                               "3GPP2" / token
      access-info            = cgi-3gpp / utran-cell-id-3gpp /
                               dsl-location / i-wlan-node-id /
                               ci-3gpp2 / eth-location /
                               ci-3gpp2-femto / fiber-location /
                               np / gstn-location /local-time-zone /
                               dvb-rcs2-node-id / extension-access-info
      np                     = "network-provided"
      extension-access-info  = gen-value
      cgi-3gpp               = "cgi-3gpp" EQUAL
                                   (token / quoted-string)
      utran-cell-id-3gpp     = "utran-cell-id-3gpp" EQUAL
                                   (token / quoted-string)
      i-wlan-node-id         = "i-wlan-node-id" EQUAL
                                   (token / quoted-string)
      dsl-location           = "dsl-location" EQUAL
                                   (token / quoted-string)
      eth-location           = "eth-location" EQUAL
                                   (token / quoted-string)
      fiber-location         = "fiber-location" EQUAL
                                   (token / quoted-string)
      ci-3gpp2               = "ci-3gpp2" EQUAL
                                   (token / quoted-string)
      ci-3gpp2-femto         = "ci-3gpp2-femto" EQUAL
                                    (token / quoted-string)
      gstn-location          = "gstn-location" EQUAL
                                    (token / quoted-string)
      dvb-rcs2-node-id       = "dvb-rcs2-node-id" EQUAL
                                     quoted-string
      local-time-zone        = "local-time-zone"  EQUAL
                                    quoted-string

      operator-specific-GI   = "operator-specific-GI" EQUAL
                                    (token / quoted-string)
      utran-sai-3gpp         = "utran-sai-3gpp" EQUAL
                                    (token / quoted-string)

Right, so the access-info part is where the juicy extra details live ๐ŸŽ€ It MAY contain additional information about the access network, so you can really spill the tea on where the user is connecting from. ๐ŸŒธ The values for cgi-3gpp, utran-cell-id-3gpp, i-wlan-node-id, dsl-location, ci-3gpp2, ci-3gpp2-femto, and gstn-location are defined in 3GPP TS 24.229 [TS24.229]. Go check that one if you want the full receipts ๐Ÿงพ


5.5. P-Charging-Function-Addresses Header Syntax ๐Ÿฆ‹

Next up is the P-Charging-Function-Addresses header field, which is the grammar for telling people where the charging functions are hanging out ๐Ÿ“

  P-Charging-Addresses = "P-Charging-Function-Addresses" HCOLON
                          charge-addr-params *(COMMA charge-addr-params)
  charge-addr-params   = charge-addr-param *(SEMI charge-addr-param)
  charge-addr-param    = ccf / ecf / ccf-2 /ecf-2 / generic-param
  ccf                  = "ccf" EQUAL gen-value
  ecf                  = "ecf" EQUAL gen-value
  ccf-2                = "ccf-2" EQUAL gen-value
  ecf-2                = "ecf-2" EQUAL gen-value

So this header holds one or two addresses, either for the ECF (ecf and ecf-2) or for the CCF (ccf and ccf-2) ๐Ÿ”ฅ The first address in the sequence is ccf or ecf. If that first one isn't available, then the next address (ccf-2 or ecf-2) MUST be used, as long as it's available. Backup plan, very responsible of us ๐Ÿซถ


5.6. P-Charging-Vector Header Syntax ๐Ÿ’œ

Now the P-Charging-Vector header field, which is honestly one of the most iconic headers because it carries all the charging correlation info ๐Ÿ‘‘

      P-Charging-Vector  = "P-Charging-Vector" HCOLON icid-value
                                  *(SEMI charge-params)
      charge-params      = icid-gen-addr / orig-ioi / term-ioi /
                           transit-ioi / related-icid /
                           related-icid-gen-addr / generic-param
      icid-value                = "icid-value" EQUAL gen-value
      icid-gen-addr             = "icid-generated-at" EQUAL host
      orig-ioi                  = "orig-ioi" EQUAL gen-value
      term-ioi                  = "term-ioi" EQUAL gen-value
      transit-ioi               = "transit-ioi" EQUAL transit-ioi-list
      transit-ioi-list          = DQUOTE transit-ioi-param
                                     *(COMMA transit-ioi-param) DQUOTE
      transit-ioi-param         = transit-ioi-indexed-value /
                                  transit-ioi-void-value
      transit-ioi-indexed-value = transit-ioi-name "."
                                                transit-ioi-index
      transit-ioi-name          = ALPHA *(ALPHA / DIGIT)
      transit-ioi-index         = 1*DIGIT
      transit-ioi-void-value    = "void"
      related-icid              = "related-icid" EQUAL gen-value
      related-icid-gen-addr     = "related-icid-generated-at" EQUAL host

Okay, so the P-Charging-Vector header has icid-value as a mandatory parameter ๐ŸŽฏ That's the IMS charging ID, and it's the thing used to correlate charging records and events. The first proxy that gets the request is the one that generates this value, so it's the OG ๐Ÿงš

The icid-gen-addr parameter holds the hostname or IP address of the proxy that generated the icid-value ๐Ÿ“ฎ

The orig-ioi and term-ioi parameters hold the originating and terminating interoperator identifiers ๐ŸŒˆ They're how charging records get matched up between different operators. The originating IOI is the network responsible for the charging records on the originating side of the session or standalone request. Similarly, the terminating IOI is the network handling the charging records on the terminating side of that same session or standalone request. Two sides, one story โœจ

The transit-ioi parameter carries values that each represent a transit interoperator identifier ๐Ÿš It's used to correlate charging records between different networks, and it represents the network responsible for the records in the transit part of the session or standalone request.

The related-icid parameter holds the icid-value of a related charging record, for when more than one call leg is tied to one session ๐Ÿค It's an OPTIONAL parameter, and it helps correlate charging info between two or more call legs that belong to the same remote-end dialog.

The related-icid-gen-addr parameter holds the hostname or IP address of the proxy that generated the related-icid ๐Ÿฆ‹

Also, applications that use the P-Charging-Vector header field within their own applicability are allowed to define generic-param extensions without going through the IETF specification process. Freedom to create, bestie ๐Ÿ’–


5.7. New Headers ๐ŸŽ€

Okay, so here's where we figure out which methods each header is allowed to show up in ๐Ÿ—บ๏ธ The P-Associated-URI header field can appear in SIP REGISTER method and 2xx responses. The P-Called-Party-ID header field can appear in SIP INVITE, OPTIONS, PUBLISH, SUBSCRIBE, and MESSAGE methods and all responses. The P-Visited-Network-ID header field can appear in all SIP methods except ACK, BYE, and CANCEL, and in all responses. The P-Access-Network-Info header field can appear in all SIP methods except ACK and CANCEL. The P-Charging-Vector header field can appear in all SIP methods except CANCEL. The P-Charging-Function-Addresses header field can appear in all SIP methods except ACK and CANCEL. Know your lanes, everyone ๐Ÿ›ฃ๏ธ


6. Security Considerations ๐Ÿ”

Okay, bestie, this part is serious, so let's get into it ๐Ÿ˜ญ Every header here has some privacy and security stuff going on, so pay attention.

6.1. P-Associated-URI Header Field ๐Ÿซฃ

The info returned in the P-Associated-URI header field isn't seen as particularly sensitive ๐Ÿ’… It's really just informational, giving the UAC some openness about the automatic association the registrar did. But if there's no end-to-end protection at the SIP layer, proxies sitting between the registrar and the UA could totally modify what's in the header value ๐Ÿ™ˆ

Also, no encryption at all, whether end-to-end or hop-by-hop, may lead to some leakage of privacy about the list of authorized identities. Like, a user who registers the address-of-record sip:user1@example.com may get another SIP URI associated as sip:first.last@example.com returned in the P-Associated-URI header field value. Wild, right? ๐Ÿ‘€

An eavesdropper could possibly collect the list of identities a user is registered with, and that can have privacy implications ๐Ÿ’€ To mitigate this, this extension SHOULD only be used in a secured environment. That means SIP messages are encrypted either end-to-end or hop-by-hop, and there's a trust relationship equivalent to the one defined in RFC 3325 [RFC3325] between the entities. In other words, the user's privacy depends on the other entities in the session not spilling what they've learned about the user ๐Ÿคซ

Heads up: even though the P-Associated-URI header field value lets one REGISTER message implicitly register a whole bundle of URIs, the security impact is no higher than using separate REGISTER messages for each of those URIs. So no extra risk, just more URIs in one go โœจ

6.2. P-Called-Party-ID Header Field ๐ŸŒธ

Because of what the P-Called-Party-ID header field is, it doesn't introduce any significant security concern ๐Ÿ™Œ It's possible for an attacker to modify the contents of the header, but that modification won't cause any harm to session establishment, so we're chill.

An eavesdropper could possibly collect the list of identities a user has registered, and that can have privacy implications ๐Ÿซ  To mitigate this, this extension SHOULD only be used in a secured environment, where SIP messages are encrypted either end-to-end or hop-by-hop.

Normally, inside a 3GPP environment, the P-Called-Party-ID isn't sent to end users, but it may be exchanged between carriers that use security mechanisms other than SIP encryption ๐Ÿงš

6.3. P-Visited-Network-ID Header Field ๐Ÿฆ‹

okay so the P-Visited-Network-ID header kinda assumes that the home network and the visited networks it passes through actually trust each other ๐Ÿค like, lowkey the whole point. Other proxies sitting between the visited-network proxy that inserts the header and the registrar or the home proxy could change the P-Visited-Network-ID value, and that is NOT it ๐Ÿ’€ so anyone participating in this mechanism MUST apply a hop-by-hop integrity-protection mechanism such as IPsec or other available mechanisms to stop those attacks ๐Ÿ”’โœจ

6.4. P-Access-Network-Info Header Field ๐ŸŒธ

okay this one is giving full security-arc energy ๐Ÿ˜ญ A Trust Domain is formally defined in RFC 3324 [RFC3324]. For the purposes of this doc, the 3GPP trust domain means the collection of SIP proxies and application servers that a 3GPP network operator runs and that follow the requirements in 3GPP TS 24.229 [TS24.229] ๐Ÿงš

This extension assumes the access network is trusted by the UA (because the UA's home network has a trust relationship with the access network), like we already covered earlier in the doc ๐Ÿ’…

This extension also assumes that the info the UAC adds should be sent only to trusted entities and MUST NOT be used outside of the trusted administrative network domain ๐Ÿšซ

The SIP proxy that provides services to the user uses this header's info to offer extra services, and UAs are expected to give correct info ๐Ÿซถ Still, there are no security problems from a UA putting in incorrect info. Networks using the P-Access-Network-Info header field will therefore need to trust the UA sending it. A rogue UA sending false access network info will do no more harm than restrict the user from certain services. bestie that is the worst-case scenario ๐Ÿ˜‚

The mechanism here is designed primarily for private systems like 3GPP, and most security requirements are met through private standardized solutions ๐ŸŒˆ

For instance, 3GPP will use the P-Access-Network-Info header field to carry relatively sensitive info like the cell ID ๐Ÿ“ก so the info MUST NOT be sent outside of the 3GPP domain. Iconic behavior, no notes ๐Ÿ™ˆ

If the UA is a 3GPP UA, it's aware that it's operating within a trusted domain ๐ŸŒธ

The 3GPP UA knows whether a secure association to the home network domain for transporting SIP signaling is currently available. Because of that, the sensitive info carried in the P-Access-Network-Info header field MUST NOT be sent in any initial unauthenticated and unprotected requests (e.g., REGISTER) ๐Ÿ”

Any UA using this extension that is not part of a private trusted domain should not consider the mechanism as secure. So it MUST NOT send sensitive info in the P-Access-Network-Info header field ๐Ÿ™…โ€โ™€๏ธ

Any proxy operating in a private trust domain where the P-Access-Network-Info header field is supported is REQUIRED to delete the header, if it is present, from any message before forwarding it outside of the trusted domain. Non-negotiable, periodt ๐Ÿ’–

A proxy that receives a message containing the P-Access-Network-Info header field from an untrusted entity can't guarantee the validity of the contents. So this content SHOULD be deleted based on local policy ๐Ÿงน

6.5. P-Charging-Function-Addresses Header Field ๐Ÿ’ธ

It's expected as normal behavior that proxies within a closed network will modify the values of the P-Charging-Function-Addresses header field and insert it into a SIP request or response ๐Ÿ“จ However, the proxies that share this info MUST have a trust relationship.

If an untrusted entity were inserted between trusted entities, it could potentially substitute a different charging function address ๐Ÿ˜ฌ So an integrity-protection mechanism such as IPsec or other available mechanisms MUST be applied to prevent such attacks. Since each trusted proxy MAY need to view or modify the values in the P-Charging-Function-Addresses header field, the protection should be applied on a hop-by-hop basis ๐Ÿ”โœจ

6.6. P-Charging-Vector Header Field โญ

Same energy here! It's expected as normal behavior that proxies within a closed network will modify the values of the P-Charging-Vector header field and insert it into a SIP request or response. However, these proxies that share this info MUST have a trust relationship ๐Ÿค

If an untrusted entity were inserted between trusted entities, it could potentially interfere with the charging correlation mechanism ๐Ÿฅบ Therefore, an integrity-protection mechanism such as IPsec or other available mechanisms MUST be applied in order to prevent such attacks. Since each trusted proxy MAY need to view or modify the values in the P-Charging-Vector header field, the protection should be applied on a hop-by-hop basis ๐Ÿ’œ


7. IANA Considerations ๐Ÿ“‹

This document defines several private SIP extension header fields (beginning with the prefix "P-" ).

This document obsoletes [RFC3455] but uses the same SIP header field names. The references in the "Header Fields" registry and "Header Field Parameters and Parameter Values" registry have been updated to [RFC3455] to this document ๐Ÿ—‚๏ธ

The following extensions are registered as private extension header fields ๐Ÿ‘‘

   Header Field Name:  P-Associated-URI
   Compact Form:       none
   Reference:          RFC 7315

   Header Field Name:  P-Called-Party-ID
   Compact Form:       none
   Reference:          RFC 7315

   Header Field Name:  P-Visited-Network-ID
   Compact Form:       none
   Reference:          RFC 7315

   Header Field Name:  P-Access-Network-Info
   Parameter Name:     ci-3gpp
   Parameter Name:     ci-3gpp2
   Parameter Name:     ci-3gpp2-femto
   Parameter Name:     dsl-location
   Parameter Name:     dvb-rcs2-node-id
   Parameter Name:     eth-location
   Parameter Name:     fiber-location
   Parameter Name:     gstn-location
   Parameter Name:     i-wlan-node-id
   Parameter Name:     local-time-zone
   Parameter Name:     operator-specific-GI
   Parameter Name:     utran-cell-id-3gpp
   Parameter Name:     utran-sai-3gpp
   Compact Form:       none
   Reference:          RFC 7315
   Header Field Name:  P-Charging-Function-Addresses
   Parameter Name:     ccf
   Parameter Name:     ccf-2
   Parameter Name:     ecf
   Parameter Name:     ecf-2
   Compact Form:       none
   Reference:          RFC 7315

   Header Field Name:  P-Charging-Vector
   Parameter Name:     icid-value
   Parameter Name:     icid-generated-at
   Parameter Name:     orig-ioi
   Parameter Name:     related-icid
   Parameter Name:     related-icid-generated-at
   Parameter Name:     term-ioi
   Parameter Name:     transit-ioi
   Compact Form:       none
   Reference:          RFC 7315

8. Contributors and Acknowledgements ๐Ÿซถ

The authors would like to thank James Yu and Atle Monrad for their extensive review, Dean Willis for his expert review, and Mary Barnes for the proto review ๐Ÿ™Œ The authors would also like to acknowledge the constructive feedback and contributions provided by Peter Leis, Joergen Axell, and Jan Holm ๐Ÿ’–

The extensions described in [RFC3455] were originally specified in several documents. Miguel Garcia-Martin authored the P-Associated-URI, P-Called-Party-ID, and P-Visited-Network-ID header fields. Duncan Mills authored the P-Access-Network-Info header. Eric Henrikson authored the P-Charging-Function-Addresses and P-Charging-Vector headers. Rohan Mahy assisted in the incorporation of these extensions into a single document ๐Ÿงฉ

The listed authors of [RFC3455] were Miguel Garcia-Martin, Eric Henrikson and Duncan Mills ๐Ÿ“

The [RFC3455] authors thanked Andrew Allen, Gabor Bajko, Gonzalo Camarillo, Keith Drage, Georg Mayer, Dean Willis, Rohan Mahy, Jonathan Rosenberg, Ya-Ching Tan, and the 3GPP CN1 WG members for their comments on [RFC3455] ๐ŸŒท

9. References ๐Ÿ“š

9.1. Normative References

  • [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
  • [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, A., Peterson, J., Sparks, R., Handley, M., and E. Schooler, "SIP: Session Initiation Protocol", RFC 3261, June 2002.
  • [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", STD 68, RFC 5234, January 2008.
  • [TS24.229] 3GPP, "IP multimedia call control protocol based on Session Initiation Protocol (SIP) and Session Description Protocol (SDP); Stage 3", 3GPP TS 24.229 12.4.0, March 2014.

9.2. Informative References

  • [RFC3324] Watson, M., "Short Term Requirements for Network Asserted Identity", RFC 3324, November 2002.
  • [RFC3325] Jennings, C., Peterson, J., and M. Watson, "Private Extensions to the Session Initiation Protocol (SIP) for Asserted Identity within Trusted Networks", RFC 3325, November 2002.
  • [RFC3455] Garcia-Martin, M., Henrikson, E., and D. Mills, "Private Header (P-Header) Extensions to the Session Initiation Protocol (SIP) for the 3rd-Generation Partnership Project (3GPP)", RFC 3455, January 2003.
  • [RFC3515] Sparks, R., "The Session Initiation Protocol (SIP) Refer Method", RFC 3515, April 2003.
  • [RFC4083] Garcia-Martin, M., "Input 3rd-Generation Partnership Project (3GPP) Release 5 Requirements on the Session Initiation Protocol (SIP)", RFC 4083, May 2005.
  • [RFC6665] Roach, A., "SIP-Specific Event Notification", RFC 6665, July 2012.
  • [RFC7044] Barnes, M., Audet, F., Schubert, S., van Elburg, J., and C. Holmberg, "An Extension to the Session Initiation Protocol (SIP) for Request History Information", RFC 7044, February 2014.
  • [TS23.228] 3GPP, "P Multimedia Subsystem (IMS); Stage 2", 3GPP TS 23.228 12.4.0, March 2014.
  • [TS32.240] 3GPP, "Telecommunication management; Charging management; Charging architecture and principles", 3GPP TS 32.240 12.3.0, March 2013.
  • [TS32.260] 3GPP, "Telecommunication management; Charging management; IP Multimedia Subsystem (IMS) charging", 3GPP TS 32.260 10.3.0, April 2011.

Appendix A. Changes from RFC 3455 ๐ŸŽ€

okay bestie, this is the changelog, and it's giving receipts ๐Ÿ’… here's everything that changed since RFC 3455:

  1. Procedures for the P-Associated-URI header field at a proxy. RFC 3455 says it defines no procedures for P-Associated-URI at a proxy. What it really means is that a proxy doesn't add, read, modify, or delete the header, so the RFC 3261 proxy procedures are the only ones that apply to it ๐Ÿฆ‹
  2. P-Called-Party-ID header field and the History-Info header field. When RFC 3455 was written, History-Info was still a long way from being specified. It's now specified and approved in RFC 7044 โœจ It's acknowledged that History-Info gives equivalent coverage to P-Called-Party-ID. However, P-Called-Party-ID is used entirely within the 3GPP system and doesn't really show up to SIP entities outside a single 3GPP operator ๐ŸŒธ
  3. Procedures at the UA for the P-Charging-Function-Addresses header field. The text in Section 4.5.2.1 of RFC 3455 doesn't properly cover UAs inside the private network, like gateways and similar devices that can play a full part in network charging procedures ๐Ÿ’ผ Section 4.5.2.1 gets replaced with new text.
  4. The text in Section 4.6.2.1 of RFC 3455 also doesn't properly cover UAs inside the private network, like gateways, which can play a full part in network charging procedures ๐Ÿซถ Section 4.6.2.1 is now replaced with new text.
  5. New access technology values in the P-Access-Network-Info header field (Section 4.4). A bunch of new access technologies are coming from 3GPP, and reusing IMS for Next Generation Networks (NGN) is making even more. RFC 3455 defines the access technology values explicitly and sets up no IANA procedures for a separate registry ๐Ÿงš So the new values are defined here: "IEEE 802.11", "IEEE-802.11g", "IEEE-802.11n", "ADSL" / "ADSL2", "ADSL2+", "RADSL", "SDSL", "HDSL", "HDSL2", "G.SHDSL", "VDSL", "IDSL", "IEEE-802.3", "IEEE-802.3a", "IEEE-802.3e", "IEEE-802.3i", "IEEE-802.3j", "IEEE-802.3u", "IEEE-802.3ab", "IEEE-802.3ae", "IEEE-802.3ak", "IEEE-802.3aq", "IEEE-802.3an", "IEEE-802.3y", "IEEE-802.3z", and "IEEE-802.3y" are defined โœจ
  6. Replacement of an existing access technology value in the P-Access-Network-Info header field (Section 4.4). The value "3GPP-CDMA2000" was replaced a long time ago in 3GPP2 by three new values: "3GPP2-1X", "3GPP2-1X-HRPD", and "3GPP2-UMB" ๐ŸŒˆ It's not believed that the "3GPP-CDMA2000" value was ever deployed, so it's a no-drama replacement ๐Ÿ“
  7. Network-provided P-Access-Network-Info header field. Proxies within the network may also provide the P-Access-Network-Info header field ๐ŸŒ This doesn't change the values a UA provides. The header is just repeated. These values are identified by the string "network-provided". A special class of values is defined for this, because the same granularity of values might not be possible as for the ones from the UA: "3GPP-GERAN", "3GPP-UTRAN", "3GPP-WLAN", "3GPP-GAN", and "3GPP-HSPA" ๐Ÿ’œ Outbound proxies remove P-Access-Network-Info header fields that contain the "network-provided" value.
  8. Additional parameters for the P-Charging-Vector header field. Section 5.6 of RFC 3455 defines the syntax of the P-Charging-Vector header field. Extra parameters were considered too application specific for RFC 3455, but everyone knew they would exist, and 3GPP has in fact specified more of them for specific access technologies ๐Ÿ”ฅ So this update says applications using P-Charging-Vector within their own applicability are allowed to define generic-param extensions without further reference to the IETF specification process ๐Ÿ‘‘
  9. In Section 5.7, it was added that the P-Called-Party-ID can appear in the PUBLISH method ๐Ÿ“ฎ
  10. Referencing. RFC 3427 was deleted from the References section because nothing in the document used it ๐Ÿ—‘๏ธ Various informative references have now been published as RFCs and have been updated with the right RFC number ๐Ÿ“š References to 3GPP TS 32.200 were replaced by references to 3GPP TS 32.240 [TS32.240], which is the successor specification. References to 3GPP TS 32.225 were replaced by references to 3GPP TS 32.260 [TS32.260], which is the successor specification. The referencing style was changed to symbolic references. Dates have been removed from all 3GPP references (i.e., the latest version applies) โญ
  11. Editorial changes. Various editorial changes were applied to match the style of RFC 3261. Examples are putting response code text in parentheses, and using the words "request" and "response" together with method names ๐Ÿ™ˆ

Authors' Addresses ๐Ÿงš

Roland Jesske
Deutsche Telekom
Heinrich-Hertz-Strasse 3-7
Darmstadt  64307
Germany

Phone: +4961515812766
EMail: r.jesske@telekom.de


Keith Drage
Alcatel-Lucent
Quadrant, StoneHill Green, Westlea
Swindon, Wilts
UK

EMail: drage@alcatel-lucent.com


Christer Holmberg
Ericsson
Hirsalantie 11
Jorvas  02420
Finland

EMail: christer.holmberg@ericsson.com
๐Ÿ“ฆ where this page comes from