Private/BgpHelpers.ps1

$script:BgpNotifyErrors = @{
    1 = 'Message Header Error'; 2 = 'OPEN Message Error'; 3 = 'UPDATE Message Error'
    4 = 'Hold Timer Expired'; 5 = 'Finite State Machine Error'; 6 = 'Cease'
}

$script:BgpCapNames = @{
    1 = 'Multiprotocol Extensions'; 2 = 'Route Refresh'; 64 = 'Graceful Restart'
    65 = '4-octet AS'; 69 = 'ADD-PATH'; 70 = 'Enhanced Route Refresh'
}

$script:BgpOrigins = @{ 0 = 'IGP'; 1 = 'EGP'; 2 = 'Incomplete' }

function Get-NetUInt {
    param([byte[]]$Bytes, [int]$Offset, [int]$Count)
    $v = [long]0
    for ($i = 0; $i -lt $Count; $i++) { $v = $v * 256 + $Bytes[$Offset + $i] }
    $v
}

function Read-BgpPrefix {
    param([byte[]]$Bytes, [int]$Start, [int]$End, [int]$Afi = 1)
    $size = if ($Afi -eq 2) { 16 } else { 4 }
    $i = $Start
    while ($i -lt $End) {
        $len = $Bytes[$i]
        $n = [int][Math]::Ceiling($len / 8)
        if ($len -gt ($size * 8) -or ($i + 1 + $n) -gt $End) { throw 'Malformed prefix in UPDATE.' }
        $a = [byte[]]::new($size)
        for ($k = 0; $k -lt $n; $k++) { $a[$k] = $Bytes[$i + 1 + $k] }
        '{0}/{1}' -f ([ipaddress]::new($a)), $len
        $i += 1 + $n
    }
}