# Attribute

<a id="attribute"></a>

# Attribute

```cpp
#include <icy/stun/attributes.h>

class Attribute
```

[Defined in src/stun/include/icy/stun/attributes.h:34](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L34)

> **Subclassed by:** [`AddressAttribute`](https://auscaster.com/icey/docs/api-reference/icy-stun-AddressAttribute.md#addressattribute), [`ErrorCode`](https://auscaster.com/icey/docs/api-reference/icy-stun-ErrorCode.md#errorcode-1), [`FlagAttribute`](https://auscaster.com/icey/docs/api-reference/icy-stun-FlagAttribute.md#flagattribute), [`MessageIntegrity`](https://auscaster.com/icey/docs/api-reference/icy-stun-MessageIntegrity.md#messageintegrity), [`StringAttribute`](https://auscaster.com/icey/docs/api-reference/icy-stun-StringAttribute.md#stringattribute), [`UInt16ListAttribute`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt16ListAttribute.md#uint16listattribute), [`UInt32Attribute`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt32Attribute.md#uint32attribute), [`UInt64Attribute`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt64Attribute.md#uint64attribute), [`UInt8Attribute`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt8Attribute.md#uint8attribute)

The virtual base class for all STUN/TURN attributes.

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`~Attribute`](#attribute-1) `virtual` `inline` |  |
| std::unique_ptr< [`Attribute`](#attribute) > | [`clone`](#clone-12) `virtual` | Returns a deep copy of this attribute. |
| `void` | [`read`](#read-7) `virtual` | Reads the body (not the type or size) for this type of attribute from the given buffer. |
| `void` | [`write`](#write-36) `virtual` `const` | Writes the body (not the type or size) to the given buffer. |
| `uint16_t` | [`type`](#type-17) `const` |  |
| `uint16_t` | [`size`](#size-12) `const` |  |
| `uint16_t` | [`paddingBytes`](#paddingbytes) `const` `inline` |  |
| `uint16_t` | [`paddedBytes`](#paddedbytes) `const` `inline` |  |
| `void` | [`consumePadding`](#consumepadding) `const` | Advances the reader past any 4-byte alignment padding that follows this attribute's body. |
| `void` | [`writePadding`](#writepadding) `const` | Writes zero-fill padding bytes to align this attribute to a 4-byte boundary. |
| `std::string` | [`typeString`](#typestring)  |  |

---

<a id="attribute-1"></a>

### ~Attribute

`virtual` `inline`

```cpp
virtual inline ~Attribute()
```

[Defined in src/stun/include/icy/stun/attributes.h:83](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L83)

---

<a id="clone-12"></a>

### clone

`virtual`

```cpp
virtual std::unique_ptr< Attribute > clone()
```

[Defined in src/stun/include/icy/stun/attributes.h:86](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L86)

Returns a deep copy of this attribute.

#### Reimplemented by

- [`AddressAttribute::clone`](https://auscaster.com/icey/docs/api-reference/icy-stun-AddressAttribute.md#clone-11)
- [`UInt8Attribute::clone`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt8Attribute.md#clone-21)
- [`UInt32Attribute::clone`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt32Attribute.md#clone-19)
- [`UInt64Attribute::clone`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt64Attribute.md#clone-20)
- [`FlagAttribute::clone`](https://auscaster.com/icey/docs/api-reference/icy-stun-FlagAttribute.md#clone-14)
- [`StringAttribute::clone`](https://auscaster.com/icey/docs/api-reference/icy-stun-StringAttribute.md#clone-17)
- [`UInt16ListAttribute::clone`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt16ListAttribute.md#clone-18)
- [`MessageIntegrity::clone`](https://auscaster.com/icey/docs/api-reference/icy-stun-MessageIntegrity.md#clone-16)
- [`ErrorCode::clone`](https://auscaster.com/icey/docs/api-reference/icy-stun-ErrorCode.md#clone-13)

---

<a id="read-7"></a>

### read

`virtual`

```cpp
virtual void read(BitReader & reader)
```

[Defined in src/stun/include/icy/stun/attributes.h:91](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L91)

Reads the body (not the type or size) for this type of attribute from the given buffer.

#### Reimplemented by

- [`FlagAttribute::read`](https://auscaster.com/icey/docs/api-reference/icy-stun-FlagAttribute.md#read-9)
- [`AddressAttribute::read`](https://auscaster.com/icey/docs/api-reference/icy-stun-AddressAttribute.md#read-6)
- [`UInt8Attribute::read`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt8Attribute.md#read-16)
- [`UInt32Attribute::read`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt32Attribute.md#read-14)
- [`UInt64Attribute::read`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt64Attribute.md#read-15)
- [`StringAttribute::read`](https://auscaster.com/icey/docs/api-reference/icy-stun-StringAttribute.md#read-12)
- [`UInt16ListAttribute::read`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt16ListAttribute.md#read-13)
- [`MessageIntegrity::read`](https://auscaster.com/icey/docs/api-reference/icy-stun-MessageIntegrity.md#read-11)
- [`ErrorCode::read`](https://auscaster.com/icey/docs/api-reference/icy-stun-ErrorCode.md#read-8)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `reader` | [`BitReader`](https://auscaster.com/icey/docs/api-reference/icy-BitReader.md#bitreader) & | Source bit reader positioned at the attribute body. |

---

<a id="write-36"></a>

### write

`virtual` `const`

```cpp
virtual void write(BitWriter & writer) const
```

[Defined in src/stun/include/icy/stun/attributes.h:95](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L95)

Writes the body (not the type or size) to the given buffer.

#### Reimplemented by

- [`FlagAttribute::write`](https://auscaster.com/icey/docs/api-reference/icy-stun-FlagAttribute.md#write-38)
- [`AddressAttribute::write`](https://auscaster.com/icey/docs/api-reference/icy-stun-AddressAttribute.md#write-35)
- [`UInt8Attribute::write`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt8Attribute.md#write-45)
- [`UInt32Attribute::write`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt32Attribute.md#write-43)
- [`UInt64Attribute::write`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt64Attribute.md#write-44)
- [`StringAttribute::write`](https://auscaster.com/icey/docs/api-reference/icy-stun-StringAttribute.md#write-41)
- [`UInt16ListAttribute::write`](https://auscaster.com/icey/docs/api-reference/icy-stun-UInt16ListAttribute.md#write-42)
- [`MessageIntegrity::write`](https://auscaster.com/icey/docs/api-reference/icy-stun-MessageIntegrity.md#write-40)
- [`ErrorCode::write`](https://auscaster.com/icey/docs/api-reference/icy-stun-ErrorCode.md#write-37)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `writer` | [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) & | Destination bit writer. |

---

<a id="type-17"></a>

### type

`const`

```cpp
uint16_t type() const
```

[Defined in src/stun/include/icy/stun/attributes.h:105](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L105)

#### Returns
The wire type code for this attribute.

---

<a id="size-12"></a>

### size

`const`

```cpp
uint16_t size() const
```

[Defined in src/stun/include/icy/stun/attributes.h:108](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L108)

#### Returns
The body length of this attribute in bytes (before padding).

---

<a id="paddingbytes"></a>

### paddingBytes

`const` `inline`

```cpp
inline uint16_t paddingBytes() const
```

[Defined in src/stun/include/icy/stun/attributes.h:123](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L123)

#### Returns
The 4-byte alignment padding required for this attribute body.

---

<a id="paddedbytes"></a>

### paddedBytes

`const` `inline`

```cpp
inline uint16_t paddedBytes() const
```

[Defined in src/stun/include/icy/stun/attributes.h:126](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L126)

#### Returns
The body length including 4-byte alignment padding.

---

<a id="consumepadding"></a>

### consumePadding

`const`

```cpp
void consumePadding(BitReader & reader) const
```

[Defined in src/stun/include/icy/stun/attributes.h:131](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L131)

Advances the reader past any 4-byte alignment padding that follows this attribute's body.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `reader` | [`BitReader`](https://auscaster.com/icey/docs/api-reference/icy-BitReader.md#bitreader) & | Reader to advance. |

---

<a id="writepadding"></a>

### writePadding

`const`

```cpp
void writePadding(BitWriter & writer) const
```

[Defined in src/stun/include/icy/stun/attributes.h:136](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L136)

Writes zero-fill padding bytes to align this attribute to a 4-byte boundary.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `writer` | [`BitWriter`](https://auscaster.com/icey/docs/api-reference/icy-BitWriter.md#bitwriter) & | Writer to append padding to. |

---

<a id="typestring"></a>

### typeString

```cpp
std::string typeString()
```

[Defined in src/stun/include/icy/stun/attributes.h:141](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L141)

#### Returns
Human-readable name for this attribute's type.

## Public Static Attributes

| Return | Name | Description |
|--------|------|-------------|
| `constexpr uint16_t` | [`TypeID`](#typeid) `static` `constexpr` |  |

---

<a id="typeid"></a>

### TypeID

`static` `constexpr`

```cpp
constexpr uint16_t TypeID = 0
```

[Defined in src/stun/include/icy/stun/attributes.h:138](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L138)

## Public Static Methods

| Return | Name | Description |
|--------|------|-------------|
| std::unique_ptr< [`Attribute`](#attribute) > | [`create`](#create-10) `static` | Creates an attribute of the given wire type and body size. Returns nullptr if the type is unknown or the size is invalid. |
| `constexpr uint16_t` | [`paddingBytes`](#paddingbytes-1) `static` `inline` `constexpr` | Returns the 4-byte alignment padding required for a body of `size` bytes. |
| `constexpr uint16_t` | [`paddedBytes`](#paddedbytes-1) `static` `inline` `constexpr` | Returns the body length including 4-byte alignment padding. |
| `std::string` | [`typeString`](#typestring-1) `static` |  |

---

<a id="create-10"></a>

### create

`static`

```cpp
static std::unique_ptr< Attribute > create(uint16_t type, uint16_t size = 0)
```

[Defined in src/stun/include/icy/stun/attributes.h:102](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L102)

Creates an attribute of the given wire type and body size. Returns nullptr if the type is unknown or the size is invalid. 
#### Returns
Owning pointer to the new attribute, or nullptr on failure.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `type` | `uint16_t` | Wire type code (one of [Attribute::Type](#type-18)). |
| `size` | `uint16_t` | Body length in bytes as read from the wire header. |

---

<a id="paddingbytes-1"></a>

### paddingBytes

`static` `inline` `constexpr`

```cpp
constexpr static inline constexpr uint16_t paddingBytes(uint16_t size)
```

[Defined in src/stun/include/icy/stun/attributes.h:111](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L111)

Returns the 4-byte alignment padding required for a body of `size` bytes.

---

<a id="paddedbytes-1"></a>

### paddedBytes

`static` `inline` `constexpr`

```cpp
constexpr static inline constexpr uint16_t paddedBytes(uint16_t size)
```

[Defined in src/stun/include/icy/stun/attributes.h:117](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L117)

Returns the body length including 4-byte alignment padding.

---

<a id="typestring-1"></a>

### typeString

`static`

```cpp
static std::string typeString(uint16_t type)
```

[Defined in src/stun/include/icy/stun/attributes.h:145](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L145)

#### Returns
Human-readable name for the given type code.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `type` | `uint16_t` | Wire type code. |

## Protected Attributes

| Return | Name | Description |
|--------|------|-------------|
| `uint16_t` | [`_type`](#_type-1)  |  |
| `uint16_t` | [`_size`](#_size-3)  |  |

---

<a id="_type-1"></a>

### _type

```cpp
uint16_t _type
```

[Defined in src/stun/include/icy/stun/attributes.h:156](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L156)

---

<a id="_size-3"></a>

### _size

```cpp
uint16_t _size
```

[Defined in src/stun/include/icy/stun/attributes.h:157](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L157)

## Protected Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`Attribute`](#attribute-2)  |  |
| `void` | [`setLength`](#setlength)  | Updates the stored body length. |

---

<a id="attribute-2"></a>

### Attribute

```cpp
Attribute(uint16_t type, uint16_t size = 0)
```

[Defined in src/stun/include/icy/stun/attributes.h:150](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L150)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `type` | `uint16_t` | Wire type code for this attribute. |
| `size` | `uint16_t` | Initial body length in bytes. |

---

<a id="setlength"></a>

### setLength

```cpp
void setLength(uint16_t size)
```

[Defined in src/stun/include/icy/stun/attributes.h:154](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L154)

Updates the stored body length.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `size` | `uint16_t` | New body length in bytes. |

## Public Types

| Name | Description |
|------|-------------|
| [`Type`](#type-18)  |  |

---

<a id="type-18"></a>

### Type

```cpp
enum Type
```

[Defined in src/stun/include/icy/stun/attributes.h:37](https://github.com/auscaster/icey/blob/main/src/stun/include/icy/stun/attributes.h#L37)

| Value | Description |
|-------|-------------|
| `NotExist` |  |
| `MappedAddress` |  |
| `ResponseAddress` |  |
| `ChangeRequest` |  |
| `SourceAddress` |  |
| `ChangedAddress` |  |
| `Username` |  |
| `Password` |  |
| `MessageIntegrity` |  |
| `ErrorCode` |  |
| `Bandwidth` |  |
| `DestinationAddress` |  |
| `UnknownAttributes` |  |
| `ReflectedFrom` |  |
| `MagicCookie` |  |
| `Realm` |  |
| `Nonce` |  |
| `XorMappedAddress` |  |
| `Software` |  |
| `Options` |  |
| `AlternateServer` |  |
| `Fingerprint` |  |
| `ChannelNumber` | TURN. |
| `Lifetime` |  |
| `XorPeerAddress` |  |
| `Data` |  |
| `XorRelayedAddress` |  |
| `EventPort` |  |
| `RequestedTransport` |  |
| `DontFragment` |  |
| `ReservationToken` | 0x0021: Reserved (was TIMER-VAL) |
| `ConnectionID` | TURN TCP. |
| `ICEControlled` | ICE. |
| `ICEControlling` |  |
| `ICEPriority` |  |
| `ICEUseCandidate` |  |
