Skip to main content

multiboot2/
network.rs

1//! Module for [`NetworkTag`].
2
3use crate::{TagHeader, TagType, TagTypeId};
4use multiboot2_common::{MaybeDynSized, Tag};
5use ptr_meta::Pointee;
6#[cfg(feature = "builder")]
7use {alloc::boxed::Box, multiboot2_common::new_boxed};
8
9/// The end tag ends the information struct.
10#[derive(Debug, Pointee)]
11#[repr(C, align(8))]
12pub struct NetworkTag {
13    typ: TagTypeId,
14    size: u32,
15    dhcpack: [u8],
16}
17
18impl NetworkTag {
19    /// Create a new network tag from the given DHCP package.
20    #[cfg(feature = "builder")]
21    #[must_use]
22    pub fn new(dhcp_pack: &[u8]) -> Box<Self> {
23        let header = TagHeader::new(Self::ID, 0);
24        new_boxed(header, &[dhcp_pack])
25    }
26}
27
28impl MaybeDynSized for NetworkTag {
29    type Header = TagHeader;
30
31    const BASE_SIZE: usize = size_of::<TagHeader>();
32
33    fn dst_len(header: &TagHeader) -> usize {
34        header.size as usize - Self::BASE_SIZE
35    }
36}
37
38impl Tag for NetworkTag {
39    type IDType = TagType;
40
41    const ID: TagType = TagType::Network;
42}