Public/New-BgpOpen.ps1

function New-BgpOpen {
    <#
    .SYNOPSIS
        Builds a BGP OPEN with Multiprotocol (MP-BGP) and 4-octet AS capabilities.
    .PARAMETER AddressFamily
        Address families to advertise as unicast capabilities. Default IPv4; add IPv6 for MP-BGP IPv6 unicast (RFC 4760).
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][uint32]$AS,
        [Parameter(Mandatory)][ipaddress]$RouterId,
        [uint16]$HoldTime = 90,
        [ValidateSet('IPv4', 'IPv6')][string[]]$AddressFamily = 'IPv4'
    )
    $myAs = if ($AS -gt 65535) { 23456 } else { $AS }   # AS_TRANS

    # Optional parameters: type 2 (capabilities), each wrapping one capability (code, len, value)
    $fields = @()
    $i = 0
    foreach ($af in $AddressFamily | Select-Object -Unique) {
        $i++
        $fields += New-PacketField "ParamType$i" 2 -Bytes 1
        $fields += New-PacketField "ParamLen$i"  6 -Bytes 1
        $fields += New-PacketField "CapCode$i"   1 -Bytes 1   # Multiprotocol Extensions
        $fields += New-PacketField "CapLen$i"    4 -Bytes 1
        $fields += New-PacketField "Afi$i"       $(if ($af -eq 'IPv6') { 2 } else { 1 }) -Bytes 2
        $fields += New-PacketField "Reserved$i"  0 -Bytes 1
        $fields += New-PacketField "Safi$i"      1 -Bytes 1
    }
    $fields += New-PacketField ParamType2 2 -Bytes 1
    $fields += New-PacketField ParamLen2  6 -Bytes 1
    $fields += New-PacketField CapCode2   65 -Bytes 1  # 4-octet AS
    $fields += New-PacketField CapLen2    4 -Bytes 1
    $fields += New-PacketField Asn4       $AS -Bytes 4
    $caps = New-Packet -Field $fields

    $body = New-Packet -Field @(
        New-PacketField Version   4 -Bytes 1
        New-PacketField MyAs      $myAs -Bytes 2
        New-PacketField HoldTime  $HoldTime -Bytes 2
        New-PacketField BgpId     $RouterId
        New-PacketField OptLen    $caps.Length -Bytes 1
        New-PacketField OptParams $caps
    )
    New-BgpMessage -Type 1 -Body $body
}