Via headers can be used to prevent request looping and ensure replies take the same path as the requests. The Via syntax is defined in RFC 3261 as follows:
Via = ( "Via" / "v" ) HCOLON via-parm *(COMMA via-parm) via-parm = sent-protocol LWS sent-by *( SEMI via-params ) via-params = via-ttl / via-maddr / via-received / via-branch / via-extension via-ttl = "ttl" EQUAL ttl via-maddr = "maddr" EQUAL host via-received = "received" EQUAL (IPv4address / IPv6address) via-branch = "branch" EQUAL token via-extension = generic-param sent-protocol = protocol-name SLASH protocol-version SLASH transport protocol-name = "SIP" / token protocol-version = token transport = "UDP" / "TCP" / "TLS" / "SCTP" / other-transport sent-by = host [ COLON port ] ttl = 1*3DIGIT ; 0 to 255
via-compression = "comp" EQUAL ("sigcomp" / other-compression) via-params /= via-compression
RFC 3581 defines a parameter "rport":
response-port = "rport" [EQUAL 1*DIGIT]
via-params /= response-port
The parsed Via header is stored in sip_via_t structure.
Data Structures | |
| struct | sip_via_s |
| Structure for Via header field. More... | |
Defines | |
| #define | sip_via(sip) |
| Access a SIP Via header structure sip_via_t from sip_t. | |
| #define | SIP_VIA_INIT() |
| Initializer for structure sip_via_t. | |
| #define | SIPTAG_VIA(x) |
| Tag list item for pointer to a Via header structure sip_via_t. | |
| #define | SIPTAG_VIA_REF(x) |
| Tag list item for reference to a Via header pointer. | |
| #define | SIPTAG_VIA_STR(s) |
| Tag list item for string with Via header value. | |
| #define | SIPTAG_VIA_STR_REF(x) |
| Tag list item for reference to a Via header string. | |
Typedefs | |
| typedef sip_via_s | sip_via_t |
| The structure sip_via_t contains representation of SIP Via header. | |
Functions | |
| issize_t | sip_via_d (su_home_t *, msg_header_t *, char *s, isize_t slen) |
| Parse a SIP Via header. | |
| issize_t | sip_via_e (char b[], isize_t bsiz, msg_header_t const *h, int flags) |
| Print a SIP Via header. | |
| sip_via_t * | sip_via_init (sip_via_t x[1]) |
| Initialize a structure sip_via_t. | |
| int | sip_is_via (sip_header_t const *header) |
| Test if header object is instance of sip_via_t. | |
| sip_via_t * | sip_via_dup (su_home_t *home, sip_via_t const *hdr)) |
| Duplicate a list of Via header header structures sip_via_t. | |
| sip_via_t * | sip_via_copy (su_home_t *home, sip_via_t const *hdr)) |
| Copy a list of Via header header structures sip_via_t. | |
| sip_via_t * | sip_via_make (su_home_t *home, char const *s)) |
| Make a Via header structure sip_via_t. | |
| sip_via_t * | sip_via_format (su_home_t *home, char const *fmt,...))) |
| Make a Via header from formatting result. | |
| int | sip_via_add_param (su_home_t *home, sip_via_t *v, char const *param) |
| Add a parameter to a Via header object. | |
| sip_via_t * | sip_via_create (su_home_t *home, char const *host, char const *port, char const *transport,...) |
| Create a Via object. | |
| char const * | sip_via_port (sip_via_t const *v, int *using_rport) |
| Get port number corresponding to a Via line. | |
| sip_via_t * | sip_via_remove (msg_t *msg, sip_t *sip) |
| Get first via header and remove it from its fragment chain. | |
Variables | |
| msg_hclass_t | sip_via_class [] |
| Header class for Via header. | |
| tag_typedef_t | siptag_via |
| Tag for Via header object. | |
| tag_typedef_t | siptag_via_str |
| Tag for string with Via header value. | |
|
|
Initializer for structure sip_via_t. A static sip_via_t structure for Via header must be initialized with the SIP_VIA_INIT() macro. For instance, |
|
|
Tag list item for pointer to a Via header structure sip_via_t. The SIPTAG_VIA() macro is used to include a tag item with a pointer to a sip_via_t structure in a tag list.
|
|
|
Tag list item for string with Via header value. The SIPTAG_VIA_STR() macro is used to include a tag item with a string containing value of a sip_via_t header in a tag list.
The corresponding tag taking reference parameter is SIPTAG_VIA_STR_REF(). |
|
|
The structure sip_via_t contains representation of SIP Via header. The sip_via_t is defined as follows: typedef struct sip_via_s { sip_common_t v_common[1]; // Common fragment info sip_via_t *v_next; // Link to next @Via header char const *v_protocol; // Application and transport protocol char const *v_host; // Hostname char const *v_port; // Port number msg_param_t const *v_params; // List of via-params char const *v_comment; // Comment char const *v_ttl; // "ttl" parameter char const *v_maddr; // "maddr" parameter char const *v_received; // "received" parameter char const *v_branch; // "branch" parameter char const *v_comp; // "comp" parameter char const *v_rport; // "rport" parameter } sip_via_t; |
|
|
Test if header object is instance of sip_via_t. Check if the header class is an instance of Via header object and return true (nonzero), otherwise return false (zero).
|
|
||||||||||||||||
|
Add a parameter to a Via header object.
|
|
||||||||||||
|
Copy a list of Via header header structures sip_via_t.
The function sip_via_copy() copies a header structure hdr. If the header structure hdr contains a reference (
|
|
||||||||||||||||||||||||
|
Create a Via object. Create a new Via header object with given parameters. If transport is NULL, the default transport "SIP/2.0/UDP" is used. A NULL-terminated list of parameters can be specified after transport.
|
|
||||||||||||
|
Duplicate a list of Via header header structures sip_via_t.
Duplicate a header structure hdr. If the header structure hdr contains a reference (
|
|
||||||||||||||||
|
Make a Via header from formatting result. Make a new sip_via_t object using formatting result as its value. The function first prints the arguments according to the format fmt specified. Then it allocates a new header structure, and parses the formatting result to the structure sip_via_t.
|
|
|
Initialize a structure sip_via_t. An sip_via_t structure for Via header can be initialized with the sip_via_init() function/macro. For instance, |
|
||||||||||||
|
Make a Via header structure sip_via_t. The function sip_via_make() makes a new sip_via_t header structure. It allocates a new header structure, and decodes the string s as the value of the structure.
|
|
||||||||||||
|
Get port number corresponding to a Via line. If using_rport is non-null, try rport. If *using_rport is non-zero, try rport even if <protocol> is not UDP. If <protocol> is UDP, set *using_rport to zero. |
|
|
Header class for Via header. The header class sip_via_class defines how a SIP Via header is parsed and printed. It also contains methods used by SIP parser and other functions to manipulate the sip_via_t header structure. |