Public/New-OspfLsa.ps1

function New-OspfLsa {
    <#
    .SYNOPSIS
        Builds a complete LSA (header + body, Fletcher checksum filled in) as byte[].
    .EXAMPLE
        New-OspfLsa -Type External -AdvertisingRouter 1.1.1.1 -LinkStateId 10.9.0.0 -Mask 255.255.255.0 -Metric 20
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][ValidateSet('Router', 'Network', 'SummaryNetwork', 'SummaryAsbr', 'External')][string]$Type,
        [Parameter(Mandatory)][ipaddress]$AdvertisingRouter,
        [ipaddress]$LinkStateId,
        [long]$Sequence = 2147483649,
        [ValidateRange(0, 3600)][int]$Age = 0,
        [ValidateRange(0, 255)][int]$Options = 2,
        [object[]]$Link = @(),
        [ValidateRange(0, 255)][int]$Flags = 0,
        [ipaddress]$Mask = '255.255.255.0',
        [ipaddress[]]$AttachedRouter = @(),
        [ValidateRange(0, 16777215)][int]$Metric = 10,
        [ValidateSet(1, 2)][int]$ExternalType = 2,
        [ipaddress]$ForwardingAddress = '0.0.0.0',
        [long]$Tag = 0
    )
    if (-not $LinkStateId) {
        if ($Type -eq 'Router') { $LinkStateId = $AdvertisingRouter } else { throw '-LinkStateId is required for this LSA type' }
    }
    $body = [System.Collections.Generic.List[byte]]::new()
    switch ($Type) {
        'Router' {
            $body.Add([byte]$Flags); $body.Add(0)
            $body.AddRange([byte[]](ConvertTo-OspfBytes $Link.Count 2))
            foreach ($l in $Link) {
                $body.AddRange([byte[]]$l.LinkId.GetAddressBytes())
                $body.AddRange([byte[]]$l.LinkData.GetAddressBytes())
                $body.Add([byte]$l.Type); $body.Add(0)
                $body.AddRange([byte[]](ConvertTo-OspfBytes $l.Metric 2))
            }
        }
        'Network' {
            $body.AddRange([byte[]]$Mask.GetAddressBytes())
            foreach ($r in $AttachedRouter) { $body.AddRange([byte[]]$r.GetAddressBytes()) }
        }
        { $_ -in 'SummaryNetwork', 'SummaryAsbr' } {
            $body.AddRange([byte[]]$Mask.GetAddressBytes())
            $body.AddRange([byte[]](ConvertTo-OspfBytes $Metric 4))
        }
        'External' {
            $body.AddRange([byte[]]$Mask.GetAddressBytes())
            $e = if ($ExternalType -eq 2) { [long]2147483648 } else { 0 }
            $body.AddRange([byte[]](ConvertTo-OspfBytes ([long]$e + $Metric) 4))
            $body.AddRange([byte[]]$ForwardingAddress.GetAddressBytes())
            $body.AddRange([byte[]](ConvertTo-OspfBytes $Tag 4))
        }
    }
    $lsa = [byte[]](Join-OspfBytes (ConvertTo-OspfBytes $Age 2) (ConvertTo-OspfBytes $Options 1) (ConvertTo-OspfBytes $script:LsaTypeNumbers[$Type] 1) `
            $LinkStateId.GetAddressBytes() $AdvertisingRouter.GetAddressBytes() (ConvertTo-OspfBytes $Sequence 4) (ConvertTo-OspfBytes 0 2) `
            (ConvertTo-OspfBytes (20 + $body.Count) 2) $body.ToArray())
    Set-OspfLsaChecksum $lsa
    , $lsa
}