# AVP DIAMETER, tipi di dato e Result-Code

> Gli AVP (Attribute-Value Pair) trasportano tutti i dati DIAMETER. Ciascuno ha un AVP Code, un ottetto di flag (V vendor, M mandatory, P riservato), una length, un Vendor-Id opzionale e un valore tipizzato. I valori usano tipi di base come Unsigned32, OctetString, Address, Time, Enumerated e Grouped. Gli AVP Result-Code ed Experimental-Result riportano gli esiti.

- URL canonico: https://www.broadnet.me/it/reference/diameter-avps-and-message-format
- Lingua: it
- Ultimo aggiornamento: 2026-07-18
- Editore: BroadNet (https://www.broadnet.me)

L'anatomia di un AVP DIAMETER: code, flag V/M/P, length, Vendor-Id opzionale e dati; i tipi di dato di base (Enumerated, Unsigned32, OctetString, Address, Time); gli AVP Grouped; e il modello di errore Result-Code / Experimental-Result.

## Struttura dell'AVP

Ogni elemento di dato DIAMETER — identità, campi di sottoscrizione, quote, esiti — è codificato come AVP. Un AVP inizia con un AVP Code a 32 bit, poi un ottetto di flag, una length a 24 bit che copre l'intero AVP, un Vendor-Id opzionale a 32 bit e il valore riempito fino a un confine di 4 ottetti. L'AVP Code da solo è univoco nello spazio gestito dall'IETF; quando il flag V (Vendor-Specific) è impostato il code viene invece interpretato nello spazio di numerazione del Vendor-Id che segue — è così che 3GPP (Vendor-Id 10415) definisce le centinaia di AVP usati da S6a, Gx e Cx senza collidere con il protocollo di base.

*Formato AVP RFC 6733*

```text
0                   1                   2                   3
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         AVP Code (32)                      |
| V M P r r r r r|                AVP Length (24)            |
|              Vendor-Id (32)  — present only if V=1          |
|    Data ...  (padded to a 4-octet boundary)                |
```

## I flag V, M e P

Tre flag dell'AVP governano il modo in cui un ricevente deve trattare l'AVP. V (Vendor-Specific) segnala che segue un Vendor-Id e che l'AVP Code appartiene allo spazio di quel vendor. M (Mandatory) è quello importante: se M è impostato e il ricevente non comprende l'AVP, deve rifiutare l'intero messaggio con DIAMETER_AVP_UNSUPPORTED (5001) — quindi impostare M erroneamente rompe l'interlavoro, e gli AVP vendor che un'implementazione può ignorare in sicurezza vengono inviati con M azzerato. P era originariamente un marcatore di sicurezza end-to-end; la RFC 6733 ne ha deprecato l'uso e il bit è ora riservato e impostato a zero.

*Bit di flag AVP*

| Flag | Nome | Significato quando impostato |
|---|---|---|
| V | Vendor-Specific | È presente un campo Vendor-Id; il codice si trova nello spazio di quel vendor |
| M | Obbligatorio | Il destinatario deve comprenderlo o rifiutare il messaggio (5001) |
| P | (riservato) | Precedentemente sicurezza end-to-end; deprecata da RFC 6733, impostata a 0 |

## Tipi di dato di base

I valori degli AVP sono fortemente tipizzati. La RFC 6733 definisce un insieme di tipi di base e diversi tipi derivati costruiti a partire da OctetString. I tipi Integer e unsigned trasportano contatori, identificatori ed enumerazioni; OctetString trasporta dati binari opachi o strutturati; e i tipi derivati aggiungono una semantica che un'implementazione può validare. Address codifica un indirizzo IP con una famiglia di indirizzi iniziale di due ottetti. Time è un conteggio di secondi in stile NTP a 32 bit. Enumerated è un Integer32 i cui valori sono nominati dall'applicazione. DiameterIdentity e DiameterURI trasportano FQDN e URI dei peer.

*Tipi di dato AVP DIAMETER comuni*

| Tipo | Codifica | Uso tipico |
|---|---|---|
| Unsigned32 / Integer32 | Intero a 32 bit | Contatori, quote, Auth-Application-Id, Result-Code |
| Unsigned64 / Integer64 | Intero a 64 bit | Volumi in ottetti, contatori grandi |
| OctetString | Ottetti opachi | Payload binari (vettori di autenticazione, TPDU) |
| UTF8String | OctetString | Testo leggibile dall'uomo (User-Name, nome del prodotto) |
| Enumerated | Integer32 | Insiemi di valori denominati (ad es. RAT-Type, CC-Request-Type) |
| Address | OctetString + famiglia | Indirizzi IPv4/IPv6 (Host-IP-Address, Framed-IP) |
| Ora | Unsigned32 | Secondi dal 1900 (Event-Timestamp) |
| DiameterIdentity | OctetString | FQDN Peer (Origin-Host, Destination-Host) |
| Grouped | AVP annidati | AVP che contengono altri AVP |

## AVP Grouped

Un AVP Grouped ha come valore un elenco concatenato di altri AVP — così i record strutturati si annidano in modo pulito senza nuove regole sul filo. Subscription-Data in S6a, Charging-Rule-Install in Gx ed Experimental-Result trasportano tutti sub-AVP all'interno di un gruppo. Il raggruppamento è ricorsivo: un AVP Grouped può contenere ulteriori AVP Grouped, ed è così che un profilo di sottoscrizione LTE completo o un insieme di regole PCC viene espresso come un unico AVP di primo livello. Ogni AVP contenuto conserva il proprio code, flag e length, quindi un ricevente analizza il gruppo con lo stesso meccanismo che usa al livello superiore.

## Result-Code ed Experimental-Result

DIAMETER riporta l'esito di una richiesta nella risposta. L'AVP Result-Code di base (code 268) è un Unsigned32 raggruppato in intervalli per cifra iniziale: 1xxx informativo, 2xxx successo, 3xxx errori di protocollo (da un proxy/relay), 4xxx guasti transitori che il client può ritentare, e 5xxx guasti permanenti. Quando un'applicazione necessita di un errore vendor-specific che il Result-Code di base non può esprimere, usa l'AVP Experimental-Result (code 297) — un AVP Grouped che trasporta un Vendor-Id più un Experimental-Result-Code — ed è così che 3GPP segnala errori come DIAMETER_ERROR_USER_UNKNOWN o DIAMETER_ERROR_ROAMING_NOT_ALLOWED.

*Intervalli di Result-Code e valori comuni*

| Intervallo | Classe | Esempio |
|---|---|---|
| 1xxx | Informativo | 1001 DIAMETER_MULTI_ROUND_AUTH |
| 2xxx | Successo | 2001 DIAMETER_SUCCESS |
| 3xxx | Errore di protocollo (proxy) | 3002 UNABLE_TO_DELIVER, 3007 APPLICATION_UNSUPPORTED |
| 4xxx | Errore temporaneo (riprova) | 4181 AUTHENTICATION_DATA_UNAVAILABLE (3GPP) |
| 5xxx | Errore permanente | 5001 AVP_UNSUPPORTED, 5012 UNABLE_TO_COMPLY |

## Domande frequenti

### Che cos'è un AVP in DIAMETER?

Un AVP (Attribute-Value Pair) è l'unità di dato in ogni messaggio DIAMETER. Trasporta un AVP Code, un ottetto di flag (V, M, P), una length, un Vendor-Id opzionale e un valore tipizzato. Tutte le identità, i campi di sottoscrizione, le quote e gli esiti sono codificati come AVP, e un messaggio è un header seguito da un elenco di essi.

### Cosa fa il flag M (Mandatory)?

Se il flag M è impostato e il ricevente non comprende quell'AVP, deve rifiutare l'intero messaggio con DIAMETER_AVP_UNSUPPORTED (5001). Gli AVP che un peer può ignorare in sicurezza vengono quindi inviati con M azzerato. L'uso errato del bit M è una causa comune di fallimenti di interlavoro tra vendor.

### Che cos'è un AVP Grouped?

Un AVP Grouped è un AVP il cui valore è a sua volta un elenco di AVP, che consente l'annidamento di record strutturati. Subscription-Data, Charging-Rule-Install ed Experimental-Result sono AVP Grouped. Il raggruppamento è ricorsivo, quindi un profilo di sottoscrizione LTE completo o un insieme di regole PCC può essere trasportato come un unico AVP di primo livello.

### Come vengono identificati gli AVP vendor-specific?

Dal flag V più un campo Vendor-Id. Quando V è impostato, un Vendor-Id a 32 bit segue la length e l'AVP Code viene interpretato nello spazio di numerazione di quel vendor. 3GPP usa il Vendor-Id 10415 per definire gli AVP di S6a, Gx, Cx e le altre interfacce applicative.

### Qual è la differenza tra Result-Code ed Experimental-Result?

Result-Code (AVP 268) trasporta i codici di esito IETF di base raggruppati come 1xxx/2xxx/3xxx/4xxx/5xxx. Experimental-Result (AVP 297) è un AVP Grouped con un Vendor-Id e un Experimental-Result-Code, usato quando un'applicazione necessita di un errore vendor-specific come il DIAMETER_ERROR_USER_UNKNOWN di 3GPP.

### Cosa significano gli intervalli di result-code DIAMETER?

1xxx è informativo, 2xxx è successo (2001 DIAMETER_SUCCESS), 3xxx è un errore di protocollo generalmente sollevato da un proxy, 4xxx è un guasto transitorio che il client può ritentare, e 5xxx è un guasto permanente. La cifra iniziale indica al client se ritentare, fallire o reinstradare.

## Fonti

- [IETF RFC 6733 — Diameter Base Protocol (AVPs, section 4)](https://datatracker.ietf.org/doc/html/rfc6733)
- [3GPP TS 29.272 — S6a/S6d AVP definitions](https://www.3gpp.org/dynareport/29272.htm)

## Correlati

- [Protocollo di base DIAMETER (RFC 6733)](https://www.broadnet.me/it/reference/diameter-base-protocol)
- [DIAMETER vs RADIUS](https://www.broadnet.me/it/reference/diameter-vs-radius)
- [DIAMETER S6a/S6d verso l'HSS](https://www.broadnet.me/it/reference/diameter-s6a-s6d-hss)
- [DIAMETER Gx/Gy policy e charging](https://www.broadnet.me/it/reference/diameter-gx-gy-policy-charging)
- [Sviluppatori](https://www.broadnet.me/it/developers)
