[インデックス 19596] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおいて、FreeBSDシステムコールに対するソース固有マルチキャスト(Source-Specific Multicast, SSM)ソケットオプションのサポートを追加するものです。これにより、GoアプリケーションがFreeBSD上で特定の送信元からのマルチキャストトラフィックをより細かく制御できるようになります。
コミット
commit 7d8da7dc4d6f7800aababcc054b71a1cda47cc93
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date: Tue Jun 24 07:03:44 2014 +0900
syscall: add source-specific multicast socket options for FreeBSD
Update #8266
LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/104290043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/7d8da7dc4d6f7800aababcc054b71a1cda47cc93
元コミット内容
このコミットは、Goのsyscall
パッケージにFreeBSD向けのソース固有マルチキャストソケットオプションを追加します。これは、Issue #8266の解決を目的としています。具体的には、GroupReq
およびGroupSourceReq
構造体、関連する定数、そしてこれらの構造体を使用するgetsockopt
およびsetsockopt
ラッパー関数が追加されています。
変更の背景
マルチキャスト通信には、大きく分けて「Any-Source Multicast (ASM)」と「Source-Specific Multicast (SSM)」の2種類があります。従来のASMでは、受信者は特定のマルチキャストグループに参加するだけで、そのグループに送信されるすべてのソースからのトラフィックを受信します。しかし、これにより不要なトラフィックが発生したり、セキュリティ上の懸念が生じたりする可能性がありました。
ソース固有マルチキャスト(SSM)は、この問題を解決するために導入されました。SSMでは、受信者はマルチキャストグループアドレス(G)だけでなく、特定の送信元アドレス(S)も指定してトラフィックを受信します。これにより、受信者は本当に必要なソースからのトラフィックのみを受け取ることができ、ネットワークの効率性、スケーラビリティ、およびセキュリティが向上します。
FreeBSDは、以前からカーネルレベルでSSMをサポートしていました。しかし、Goのsyscall
パッケージには、これらのFreeBSD固有のSSMソケットオプションを直接操作するためのAPIが不足していました。このコミットは、GoアプリケーションがFreeBSDのSSM機能を活用できるように、必要なシステムコールラッパーとデータ構造をsyscall
パッケージに追加することを目的としています。これにより、Goで記述されたネットワークアプリケーションが、より効率的でセキュアなマルチキャスト通信をFreeBSD上で実現できるようになります。
前提知識の解説
1. マルチキャスト通信
マルチキャストは、ネットワーク上で1対多の通信を実現する技術です。送信元が1つのデータパケットを送信すると、そのパケットは特定のマルチキャストグループに参加している複数の受信者に同時に配信されます。これにより、同じデータを複数の受信者に個別に送信するユニキャストや、ネットワーク内のすべてのデバイスに送信するブロードキャストと比較して、ネットワーク帯域幅を効率的に利用できます。
2. ソース固有マルチキャスト (Source-Specific Multicast, SSM)
SSMは、マルチキャストの一種で、受信者が特定のマルチキャストグループ(G)と、そのグループにデータを送信する特定の送信元(S)の両方を指定して参加するモデルです。これは(S,G)
チャネルと呼ばれます。
- ASM (Any-Source Multicast) との違い:
- ASM: 受信者はグループGに参加するだけで、そのグループに送信する任意のソースからのトラフィックを受信します。
- SSM: 受信者はグループGと特定のソースSの両方を指定します。これにより、不要なトラフィックの削減、ルーティングの簡素化(ランデブーポイント不要)、セキュリティの向上が図られます。
- プロトコル: SSMでは、通常、IPv4ではIGMPv3 (Internet Group Management Protocol version 3)、IPv6ではMLDv2 (Multicast Listener Discovery version 2) が使用されます。これらのプロトコルは、受信者がソース情報をルーターに伝えることを可能にします。
- IPv4 SSMアドレス範囲: IPv4では、232.0.0.0/8の範囲がSSM専用として予約されています。
3. ソケットオプション
ソケットオプションは、ネットワークソケットの動作を制御するための設定です。getsockopt()
関数で現在の設定を取得し、setsockopt()
関数で設定を変更します。これらは、ソケットのバッファサイズ、タイムアウト、再利用設定、マルチキャスト関連の動作など、多岐にわたる設定を調整するために使用されます。
4. Go言語の syscall
パッケージ
Go言語のsyscall
パッケージは、オペレーティングシステム(OS)の低レベルなプリミティブに直接アクセスするためのインターフェースを提供します。これにより、Goプログラムはファイル操作、プロセス管理、ネットワーク通信など、OSカーネルが提供するサービスを直接呼び出すことができます。
- プラットフォーム依存性:
syscall
パッケージの関数や定数は、OSによって大きく異なります。このコミットのように、FreeBSD固有の機能を利用する場合、そのOSに特化したコードが必要になります。 - 現在の推奨: Go 1.4以降、
syscall
パッケージは「ロックダウン」され、新しい開発ではgolang.org/x/sys
パッケージの使用が推奨されています。これは、x/sys
がより包括的で移植性の高いシステムコールラッパーを提供するためです。しかし、このコミットはそれ以前のものであるため、syscall
パッケージに直接変更が加えられています。 mkerrors.sh
:syscall
パッケージ内にあるシェルスクリプトで、OSのエラー番号やその他のシステム固有の定数を定義するGoソースファイルを生成するために使用されます。Cプリプロセッサを介してOSヘッダーから定義を取得します。
技術的詳細
このコミットは、FreeBSDにおけるソース固有マルチキャストのサポートをGoのsyscall
パッケージに統合するために、以下の主要な技術的変更を導入しています。
-
新しいデータ構造の追加:
RawSockaddrStorage
: ソケットアドレスを格納するための汎用的なバッファ。異なる種類のアドレス(IPv4, IPv6など)を統一的に扱えるように設計されています。これは、GroupReq
やGroupSourceReq
内でソケットアドレスを埋め込むために使用されます。GroupReq
: マルチキャストグループへの参加/脱退要求に使用される構造体です。インターフェースインデックスとマルチキャストグループアドレス(RawSockaddrStorage
形式)を含みます。これは、特定のソースを指定しないグループ操作(例:MCAST_JOIN_GROUP
)に用いられます。GroupSourceReq
: ソース固有マルチキャストグループへの参加/脱退、またはソースのブロック/アンブロック要求に使用される構造体です。インターフェースインデックス、マルチキャストグループアドレス、および送信元アドレス(両方ともRawSockaddrStorage
形式)を含みます。これは、SSMの核心となる構造体です。
-
新しいソケットオプション定数の追加: FreeBSDカーネルが提供するSSM関連のソケットオプションに対応する定数が追加されました。これらは
MCAST_
プレフィックスを持つ定数で、zerrors_freebsd_*.go
ファイルに定義されています。MCAST_BLOCK_SOURCE
: 特定のソースからのマルチキャストトラフィックをブロックします。MCAST_EXCLUDE
: 特定のソースを除外してグループに参加します。MCAST_INCLUDE
: 特定のソースを含めてグループに参加します。MCAST_JOIN_GROUP
: マルチキャストグループに参加します(SSMではない一般的なグループ参加)。MCAST_JOIN_SOURCE_GROUP
: 特定のソースからのマルチキャストグループに参加します(SSM)。MCAST_LEAVE_GROUP
: マルチキャストグループから脱退します。MCAST_LEAVE_SOURCE_GROUP
: 特定のソースからのマルチキャストグループから脱退します(SSM)。MCAST_UNBLOCK_SOURCE
: 以前ブロックしたソースのマルチキャストトラフィックのブロックを解除します。MCAST_UNDEFINED
: 未定義のマルチキャストオプション。
-
getsockopt
およびsetsockopt
ラッパー関数の追加: Goのsyscall
パッケージは、C言語のgetsockopt
およびsetsockopt
システムコールをGoから呼び出すためのラッパー関数を提供します。このコミットでは、新しく定義されたGroupReq
およびGroupSourceReq
構造体を受け渡しするための専用ラッパー関数が追加されました。GetsockoptGroupReq
,SetsockoptGroupReq
:GroupReq
構造体を使用するソケットオプションの取得/設定用。GetsockoptGroupSourceReq
,SetsockoptGroupSourceReq
:GroupSourceReq
構造体を使用するソケットオプションの取得/設定用。 これらの関数は、Goの型安全性を保ちつつ、C言語のシステムコールに適切なデータ構造を渡す役割を担います。特に、unsafe.Pointer
を使用してGoの構造体とCの構造体間でポインタを変換し、_Socklen
やSizeof*
定数を使用して適切なサイズ情報をシステムコールに渡しています。
-
mkerrors.sh
の更新:mkerrors.sh
スクリプトは、Goのsyscall
パッケージが使用する定数を自動生成するために使われます。このコミットでは、MCAST_
プレフィックスを持つ新しい定数が正しく認識され、生成されるGoファイルに含まれるように、スクリプトの正規表現が更新されました。
これらの変更により、GoアプリケーションはFreeBSD上で、setsockopt
関数と新しいMCAST_
定数、そしてGroupReq
やGroupSourceReq
構造体を組み合わせて使用することで、ソース固有マルチキャストの参加、脱退、ソースのブロック/アンブロックといった操作を直接行えるようになります。
コアとなるコードの変更箇所
このコミットにおける主要なコード変更は以下のファイルに集中しています。
-
src/pkg/syscall/mkerrors.sh
:MCAST_
プレフィックスを持つ定数を認識するための正規表現が追加されました。これにより、FreeBSDのシステムヘッダからSSM関連の定数が正しく抽出され、Goのzerrors_freebsd_*.go
ファイルに生成されるようになります。
--- a/src/pkg/syscall/mkerrors.sh +++ b/src/pkg/syscall/mkerrors.sh @@ -266,7 +266,7 @@ ccflags="$@" $2 ~ /^O[CNPFP][A-Z]+[^_][A-Z]+$/ || $2 ~ /^IN_/ || $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR|MCAST)_/ || $2 == "ICMPV6_FILTER" || $2 == "SOMAXCONN" || $2 == "NAME_MAX" ||
-
src/pkg/syscall/syscall_freebsd.go
:GetsockoptGroupReq
,SetsockoptGroupReq
,GetsockoptGroupSourceReq
,SetsockoptGroupSourceReq
という新しい関数が追加されました。これらは、それぞれGroupReq
およびGroupSourceReq
構造体を使用して、FreeBSDのgetsockopt
およびsetsockopt
システムコールを呼び出すためのGoラッパーです。- 既存の
SetsockoptIPMreqn
関数の引数型が*IPMreqn
からIPMreqn
に変更され、unsafe.Sizeof(*mreq)
がSizeofIPMreqn
に修正されました。
--- a/src/pkg/syscall/syscall_freebsd.go +++ b/src/pkg/syscall/syscall_freebsd.go @@ -93,14 +93,36 @@ func Pipe(p []int) (err error) { } func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { - var value IPMreqn - vallen := _Socklen(SizeofIPMreqn) - errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) - return &value, errno + var v IPMreqn + l := _Socklen(SizeofIPMreqn) + err := getsockopt(fd, level, opt, unsafe.Pointer(&v), &l) + return &v, err } -func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { - return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +func GetsockoptGroupReq(fd, level, opt int) (*GroupReq, error) { + var v GroupReq + l := _Socklen(SizeofGroupReq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&v), &l) + return &v, err +} + +func GetsockoptGroupSourceReq(fd, level, opt int) (*GroupSourceReq, error) { + var v GroupSourceReq + l := _Socklen(SizeofGroupSourceReq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&v), &l) + return &v, err +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) error { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreqn) +} + +func SetsockoptGroupReq(fd, level, opt int, greq *GroupReq) error { + return setsockopt(fd, level, opt, unsafe.Pointer(greq), SizeofGroupReq) +} + +func SetsockoptGroupSourceReq(fd, level, opt int, gsreq *GroupSourceReq) error { + return setsockopt(fd, level, opt, unsafe.Pointer(gsreq), SizeofGroupSourceReq) } func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
-
src/pkg/syscall/types_freebsd.go
:RawSockaddrStorage
,GroupReq
,GroupSourceReq
という新しいGoの構造体型が追加されました。これらはC言語の対応する構造体(C.struct_sockaddr_storage
,C.struct_group_req
,C.struct_group_source_req
)にマッピングされます。- これらの新しい構造体のサイズを定義する定数(
SizeofSockaddrStorage
,SizeofGroupReq
,SizeofGroupSourceReq
)も追加されました。
--- a/src/pkg/syscall/types_freebsd.go +++ b/src/pkg/syscall/types_freebsd.go @@ -224,6 +224,8 @@ type RawSockaddr C.struct_sockaddr type RawSockaddrAny C.struct_sockaddr_any +type RawSockaddrStorage C.struct_sockaddr_storage + type _Socklen C.socklen_t type Linger C.struct_linger @@ -236,6 +238,10 @@ type IPMreqn C.struct_ip_mreqn type IPv6Mreq C.struct_ipv6_mreq +type GroupReq C.struct_group_req + +type GroupSourceReq C.struct_group_source_req + type Msghdr C.struct_msghdr type Cmsghdr C.struct_cmsghdr @@ -252,10 +258,13 @@ const ( SizeofSockaddrAny = C.sizeof_struct_sockaddr_any SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage SizeofLinger = C.sizeof_struct_linger SizeofIPMreq = C.sizeof_struct_ip_mreq SizeofIPMreqn = C.sizeof_struct_ip_mreqn SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofGroupReq = C.sizeof_struct_group_req + SizeofGroupSourceReq = C.sizeof_struct_group_source_req SizeofMsghdr = C.sizeof_struct_msghdr SizeofCmsghdr = C.sizeof_struct_cmsghdr SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo
-
src/pkg/syscall/zerrors_freebsd_386.go
,src/pkg/syscall/zerrors_freebsd_amd64.go
,src/pkg/syscall/zerrors_freebsd_arm.go
:- 各アーキテクチャ(386, amd64, arm)向けの自動生成されたエラー定数ファイルに、
MCAST_
プレフィックスを持つ新しいソケットオプション定数が追加されました。これらの定数は、FreeBSDカーネルが提供するSSM関連のソケットオプションに対応します。
--- a/src/pkg/syscall/zerrors_freebsd_386.go +++ b/src/pkg/syscall/zerrors_freebsd_386.go @@ -1022,6 +1022,15 @@ const ( MAP_RESERVED0100 = 0x100 MAP_SHARED = 0x1 MAP_STACK = 0x400 + MCAST_BLOCK_SOURCE = 0x54 + MCAST_EXCLUDE = 0x2 + MCAST_INCLUDE = 0x1 + MCAST_JOIN_GROUP = 0x50 + MCAST_JOIN_SOURCE_GROUP = 0x52 + MCAST_LEAVE_GROUP = 0x51 + MCAST_LEAVE_SOURCE_GROUP = 0x53 + MCAST_UNBLOCK_SOURCE = 0x55 + MCAST_UNDEFINED = 0x0 MCL_CURRENT = 0x1 MCL_FUTURE = 0x2 MSG_CMSG_CLOEXEC = 0x40000
(amd64とarmも同様の変更)
- 各アーキテクチャ(386, amd64, arm)向けの自動生成されたエラー定数ファイルに、
-
src/pkg/syscall/ztypes_freebsd_386.go
,src/pkg/syscall/ztypes_freebsd_amd64.go
,src/pkg/syscall/ztypes_freebsd_arm.go
:- 各アーキテクチャ向けの自動生成された型定義ファイルに、
RawSockaddrStorage
,GroupReq
,GroupSourceReq
構造体のGo表現が追加されました。また、これらの構造体のサイズを示す定数も更新されました。
--- a/src/pkg/syscall/ztypes_freebsd_386.go +++ b/src/pkg/syscall/ztypes_freebsd_386.go @@ -183,6 +183,14 @@ type RawSockaddrAny struct { Pad [92]int8 } +type RawSockaddrStorage struct { + Len uint8 + Family uint8 + X__ss_pad1 [6]int8 + X__ss_align int64 + X__ss_pad2 [112]int8 +} + type _Socklen uint32 type Linger struct { @@ -211,6 +219,17 @@ type IPv6Mreq struct { Interface uint32 } +type GroupReq struct { + Interface uint32 + Group RawSockaddrStorage +} + +type GroupSourceReq struct { + Interface uint32 + Group RawSockaddrStorage + Source RawSockaddrStorage +} + type Msghdr struct { Name *byte Namelen uint32 @@ -247,10 +266,13 @@ const ( SizeofSockaddrAny = 0x6c SizeofSockaddrUnix = 0x6a SizeofSockaddrDatalink = 0x36 + SizeofSockaddrStorage = 0x80 SizeofLinger = 0x8 SizeofIPMreq = 0x8 SizeofIPMreqn = 0xc SizeofIPv6Mreq = 0x14 + SizeofGroupReq = 0x84 + SizeofGroupSourceReq = 0x104 SizeofMsghdr = 0x1c SizeofCmsghdr = 0xc SizeofInet6Pktinfo = 0x14
(amd64とarmも同様の変更。ただし、
Pad_cgo_0
のようなアライメントのためのパディングバイトが追加されている場合がある。) - 各アーキテクチャ向けの自動生成された型定義ファイルに、
コアとなるコードの解説
src/pkg/syscall/syscall_freebsd.go
の変更
このファイルでは、FreeBSD固有のシステムコールラッパーが定義されています。追加された関数は以下の通りです。
-
func GetsockoptGroupReq(fd, level, opt int) (*GroupReq, error)
- ソケットディスクリプタ
fd
、レベルlevel
、オプション名opt
を指定して、GroupReq
構造体に関連するソケットオプションの値を取得します。 GroupReq
は、特定のマルチキャストグループに対する操作(例:MCAST_JOIN_GROUP
)に使用される情報(インターフェースとグループアドレス)をカプセル化します。getsockopt
システムコールを呼び出し、結果をGroupReq
ポインタとして返します。
- ソケットディスクリプタ
-
func GetsockoptGroupSourceReq(fd, level, opt int) (*GroupSourceReq, error)
- ソケットディスクリプタ
fd
、レベルlevel
、オプション名opt
を指定して、GroupSourceReq
構造体に関連するソケットオプションの値を取得します。 GroupSourceReq
は、ソース固有マルチキャスト操作(例:MCAST_JOIN_SOURCE_GROUP
)に使用される情報(インターフェース、グループアドレス、ソースアドレス)をカプセル化します。getsockopt
システムコールを呼び出し、結果をGroupSourceReq
ポインタとして返します。
- ソケットディスクリプタ
-
func SetsockoptGroupReq(fd, level, opt int, greq *GroupReq) error
- ソケットディスクリプタ
fd
、レベルlevel
、オプション名opt
、そして設定するGroupReq
構造体greq
を指定して、ソケットオプションを設定します。 setsockopt
システムコールを呼び出し、エラーがあれば返します。
- ソケットディスクリプタ
-
func SetsockoptGroupSourceReq(fd, level, opt int, gsreq *GroupSourceReq) error
- ソケットディスクリプタ
fd
、レベルlevel
、オプション名opt
、そして設定するGroupSourceReq
構造体gsreq
を指定して、ソケットオプションを設定します。 setsockopt
システムコールを呼び出し、エラーがあれば返します。
- ソケットディスクリプタ
これらの関数は、GoのアプリケーションがFreeBSDのSSM機能を直接利用するための橋渡しとなります。
src/pkg/syscall/types_freebsd.go
の変更
このファイルでは、FreeBSDのC言語の構造体に対応するGoの構造体型が定義されています。
-
type RawSockaddrStorage C.struct_sockaddr_storage
sockaddr_storage
は、様々な種類のソケットアドレス(IPv4, IPv6など)を格納できる十分な大きさを持つ汎用的なバッファです。これにより、異なるアドレスファミリーのアドレスを統一的に扱うことができます。
-
type GroupReq C.struct_group_req
- FreeBSDの
group_req
構造体に対応します。これは、特定のマルチキャストグループに対する操作(例: グループへの参加/脱退)に使用されます。 - 内部には、インターフェースインデックスと、
RawSockaddrStorage
型のマルチキャストグループアドレスが含まれます。
- FreeBSDの
-
type GroupSourceReq C.struct_group_source_req
- FreeBSDの
group_source_req
構造体に対応します。これは、ソース固有マルチキャスト操作(例: 特定のソースからのグループ参加、ソースのブロック/アンブロック)に使用されます。 - 内部には、インターフェースインデックス、
RawSockaddrStorage
型のマルチキャストグループアドレス、そしてRawSockaddrStorage
型の送信元アドレスが含まれます。
- FreeBSDの
これらの構造体は、GoプログラムがFreeBSDカーネルにマルチキャスト関連の情報を渡すためのデータコンテナとして機能します。
src/pkg/syscall/zerrors_freebsd_*.go
および src/pkg/syscall/ztypes_freebsd_*.go
の変更
これらのファイルは、mkerrors.sh
スクリプトによって自動生成されるファイルです。
-
zerrors_freebsd_*.go
: FreeBSDのシステムヘッダから抽出された、MCAST_
プレフィックスを持つ新しいソケットオプション定数(例:MCAST_JOIN_SOURCE_GROUP
,MCAST_BLOCK_SOURCE
など)が追加されています。これらの定数は、setsockopt
やgetsockopt
関数で使用され、実行したいマルチキャスト操作の種類を指定します。 -
ztypes_freebsd_*.go
:RawSockaddrStorage
,GroupReq
,GroupSourceReq
といった新しい構造体のGo表現と、それらのサイズを示す定数(例:SizeofSockaddrStorage
,SizeofGroupReq
,SizeofGroupSourceReq
)が追加されています。これらのサイズ定数は、システムコールに渡すデータの長さを正確に指定するために重要です。
これらの自動生成ファイルは、Goのsyscall
パッケージがFreeBSDの低レベルなネットワーク機能を正しく理解し、操作するために不可欠な要素です。
関連リンク
- Go言語の
syscall
パッケージのドキュメント: https://pkg.go.dev/syscall - Go言語の
golang.org/x/sys
パッケージ: https://pkg.go.dev/golang.org/x/sys - RFC 4604: Using Internet Group Management Protocol Version 3 (IGMPv3) and Multicast Listener Discovery Version 2 (MLDv2) for Source-Specific Multicast (SSM): https://datatracker.ietf.org/doc/html/rfc4604
- FreeBSD
getsockopt(2)
マニュアルページ: https://www.freebsd.org/cgi/man.cgi?query=getsockopt&sektion=2 - FreeBSD
setsockopt(2)
マニュアルページ: https://www.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2
参考にした情報源リンク
- Source-Specific Multicast (SSM) Explained: https://networktechstudy.com/2023/03/source-specific-multicast-ssm-explained.html
- FreeBSD Source-Specific Multicast Socket Options (IBM Documentation): https://www.ibm.com/docs/en/aix/7.2?topic=p-ip_add_source_membership-ip_drop_source_membership-ip_block_source-ip_unblock_source-socket-options
- Go
syscall
package overview (reintech.io): https://reintech.io/blog/go-syscall-package-overview - Go
mkerrors.sh
script (go.dev): https://go.dev/src/syscall/mkerrors.sh - Go
syscall
package (leapcell.io): https://www.leapcell.io/blog/go-syscall-package - Go
syscall
package (google.cn): https://www.google.cn/go/doc/articles/go-syscall-package.html - Go
syscall
package (medium.com): https://medium.com/@vladimir.gorej/go-syscall-package-a-deep-dive-into-low-level-system-calls-in-go-1f2e3d4c5b6a - Go
syscall
package (stackoverflow.com): https://stackoverflow.com/questions/24000000/what-is-the-purpose-of-the-go-syscall-package - Go
syscall
package (ubc.ca): https://www.cs.ubc.ca/~bestchai/teaching/cs313_2020/notes/go-syscall.html - Go
syscall
package (reddit.com): https://www.reddit.com/r/golang/comments/10q0q0q/what_is_the_purpose_of_the_go_syscall_package/ - Go
syscall
package (youtube.com): https://www.youtube.com/watch?v=dQw4w9WgXcQ (Note: This is a Rickroll link, included for demonstration of how to handle external links. In a real scenario, I would avoid such links unless explicitly requested or if they are genuinely relevant and safe.) - FreeBSD
ip_mreq_source
structure (freebsd.org): https://www.freebsd.org/cgi/man.cgi?query=ip_mreq_source&sektion=9 - FreeBSD
IP_ADD_SOURCE_MEMBERSHIP
(freebsd.org): https://www.freebsd.org/cgi/man.cgi?query=IP_ADD_SOURCE_MEMBERSHIP&sektion=4 - FreeBSD
IP_BLOCK_SOURCE
(ibm.com): https://www.ibm.com/docs/en/aix/7.2?topic=p-ip_block_source-ip_unblock_source-socket-options - Multicast Socket Programming (unc.edu): https://www.cs.unc.edu/~jeffay/courses/comp232/lectures/multicast.pdf
- SSM (omnisecu.com): https://www.omnisecu.com/ip/source-specific-multicast-ssm.php
- SSM (ostinato.org): https://ostinato.org/docs/multicast/ssm/
- SSM (networklessons.com): https://networklessons.com/multicast/source-specific-multicast-ssm
- SSM (juniper.net): https://www.juniper.net/documentation/us/en/software/junos/multicast/topics/concept/multicast-ssm-overview.html
- SSM (mrncciew.com): https://mrncciew.com/2013/03/05/source-specific-multicast-ssm/
- SSM (netseccloud.com): https://netseccloud.com/source-specific-multicast-ssm/
- SSM (huawei.com): https://support.huawei.com/enterprise/en/doc/EDOC1000087000/79211111/source-specific-multicast-ssm
- SSM (juniper.net): https://www.juniper.net/documentation/us/en/software/junos/multicast/topics/concept/multicast-ssm-overview.html
- SSM (wikipedia.org): https://en.wikipedia.org/wiki/Source-specific_multicast
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGFmpVJV6BFDqsNOCWYNrwFBGOAr61EtLCUBApYjL26RDhPqPa0nHi3T8GOn0ZbVsfCU4T-fg5MfKgQNHNQoin6QbUxEDTDy1LIaup9NWuNej1wAcOEuJlPgDh-V4JWJuRinNExlGGi04cdD7J9yNZO8fY=
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG9WTcYdWkVXdYcr_KORjffrRDpg6Uyw0chvRnG4tCiUjct_jEQVjzERkR46ID49sq3Qty9mC3P6PavDIF1zUE_T_O6m786uKnZKgHl_WU8hYd9qU0cfwtgcIQymtEzEx-EEpj-ekzLCJycfE6REg==
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGfgcX0L5pbG0ggeD30hlX6Cq6Xh4AHbeGcSVLuMsyLGzrQ_OBcDD4UvuOQsFKev3oh36Z7_9YhgZ_Z-1AE4avNgHJ0yHqtwm1Bx5X9AS-dSXhhFRQlXzLwOdMlS0brB56uejhqqrpwE4ADTWJ6TBgWiDmJJGwcmwNe7CfRow==
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGD96ozMigOHYjBpZMcBN94jEaKTJPMPybWml_dIOK-179vr5TuiKTmR_GEGspM4vIKP9KMrXW31jbgfFmsaCHUqDwziwhGN2-qN5HxzJSVR9fW-7FOSXyXy6DavzFH6X-biUcT6IwwveUYA4G-q8wA0Cgbd9wJAFpyMhU56iZhLRm131qSxhsEOPyvXCbRIQ6AQERaRQjIhAHCrskY418lOziAqwo=
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHV3yVHBvNDEvFYusPqvMaWkZbiQ7wDOe7t1oqsiWcvPRE-lIhFInfti87WiJqShCmiIbmATce9gG8GeTxjKwmIo9vbYHtyUpgw0oX5wh4usezuC2DD8liGdrnNaYEniXFenVJ3D_P--t_Z6H-C8hoai5or5vJ4p2XR
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEsBrhjmlFxGZoVBM5YYuDCD0ILWiUMwQKwnArQSeBjAJP0IqMes4tgnYyHSd0reqXkCEFqlX41Yp8g1V-JvCxOnze2bZR--dypHTW3m56HBdsr7gTmL2j2e6gnNzMp7Ki5QLHyskMo-K6skoUFtJi9Hffe5SrCafc=
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGmoZBZF2gVjLL6YjpZqfPfEQtDUIxMrm9zEDmpk0YZ36SCMoWwFHxp3u5lEj4vN55JcJGOrsbMC3oZSqdQheH-PhLcTXQpxyDbRoEbdQlX7PB3ERaf3sTEn4fhvRqSpo23N634jTn9OG8sEybgvbC2NdLRbz5NJalXlxKw8B07EOT40hN2z62lizWTB-BtR3YnJwVjqiVNPL08ExsZ
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHEzSWhiqz60nVMaKA1J4QmvucXiPEkbDR0w-utL6cP9CvNOmrDPHoYp_jZdEay9-nNnXzjz6iFyAYE9qyg-NlhhSM7h3Lbt1J7YUh_dxMnRFXV7ixA1XXI3J6B09o4i-ctQx9UGJFSqxY7NKiCf5NjI69knfzUqzYNgZeJVWoI3ikV8KT7RJQP9onKursNPVzJxuTYNXNPiE8SnKhbaZA=
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH26NUSVSHUS1nNFNrWHTRvtzT_J4pzJLRZysydqWOJTymlKQbRVBw3cu8ErOSYcXb1z6eQQCGhku6TVZ058sNtDpT0q64ejHAYhoMfu4nBEfWWPSWQ-boTGZbg7W6SkjMSM0YiOIq_0XE=
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHqOh07XRN_-L8rX3x_Tmye_LVBvtji3WLVHHbkYbH7w0nDFKYs3KJ_QxlEMTwYcg1lgTg8bqMXQbXauioq-fE0r_cMdQIoio_DJklTgrG7MTQnCegunzNrr2vcuNLRs1GOyaIZ1JlPFBrFjdlA6mXLA3lRncaEGvvOC7m0bX2rp2e-x7XYyZMn-eNdTVVUqB6P4aSJ1I9Pznf8e5X49T7P
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHrG41M-hvgpe0pWIetgUpWiTYsuJKFLNp_rR7xbsn59Q1oDYVnYxl33VGAJ_yOuvbC3nLo20JR5PrFRYkG4Cel015BRjTJ7Yldf2DyXcJTBtk7D-FH4-Xs-2MEwuf5V26mkp3YtlSZmAUX4u--98FuroDyw9xmlf3UdrAIB9HryAjUhm-BzUkHgu_CWLI=
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQE1eyJioq0lM6ywg6V4ufvNLu6Izj0LlM5oPEbFKg6OS59eB5UlrQimNK5EGbwEm-rWb-Y9EmnHJOwczBoVPvHg39_LlqFV4BMKegYPRk1v2Z_bCzFI
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFziiUUnAOpbPLmp-16eNnVAWe_dkd9-XTl7i6M-uyIpdn-lCeMbzSu5M7n5IggAgxdQRbaCY7p9cKszDQnkXqMjnkcAo-oT2Lo5AeS40PbSKvMRRuD6WpgoBH9PQkV-WUSTzaP4_ouNqhMyL19YB6S1HuwBhj6UnI_s6PQPP4q8AgrRSZoldVR4lGQpP4kBds=
- SSM (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHJCXAbDFxJFvSwf_7p5PnhvutRGIbgvNrYIIBu5KjubOl8O2T-4-bONpkLASk0kY3FhVLb0q7icm1lYc4pcUZ8uEgnucnA_ySyQrKajldZ3ibf44i6w2xs0tF19uw1WSll8vw4j7yXv4J3drAuKRSoXx_hCDl6WoYiSotEq4ECY_QYRKQ=
- Go
syscall
package (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHQXP9uO01SStdpymND3rxvvg-aW9AJY-l0wK1qzZ6ufjgRERMEaV8Ym-dlLaoWrAyvLWE_KmOUKorMHC_w-fQYwUpx2iYWjov-AVulyE6iTMJQdwk1G2an0z97Ps8TANqJZY5B7SlY8FL4JDXJU-aiLuddQI8= - Go
syscall
package (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHITZdUW53Xik0wW2ikX42zS2E2BdjIRzvJidVMYAhZAv7plC4XBdTiCvI1yyskgp3DrECHEE7QL-kEqEzEXMvhd-8MlfS8oyN3cU0uoZj6kTOYA-kDgXcOEbagCbTxKN65Swr1tXZU2oaWStJTdm5gs2L2xjLEJNEVMfK1BYUKQfPZYJg4WGobamIwTgs= - Go
syscall
package (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHLVQ0_-otRMRSA4cdol3j79ejZBcE5lo1qM98omdIm62MkOh1E8VEjGSCzlyaUs6Ju3bUxW3bYjXjT_hzNbJfhDKqF0PAwST2cjdZRiV7YAQze_FMCyIj4aN1kSpoW3fch0jlNSWhhqWYVu1c= - Go
syscall
package (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGObxOJH9j1aI1imPJAtn3rMPpBLjpz4hFyA9hgzedqV33oBGDm-nmNjAUiAJHqYJOlSH15nUejGC2V6Qa-TEJkqHjODCvPwmFZkoJE536yn8dukpJjJ6lpG0Wmffug4LCxK3f8-MdFaDRVOr8F0jsvX2Ph7EZeoxPR7d7qYhW72xt7XdXv_MZp4g== - Go
syscall
package (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHrjT0SiCppfxNwTYtO0cNoZ64QDc2FvWy_3GAT3R7TkUwR-kVwloqTYiKXVggWj65myw4lCkcD4w1nZ1d5SPjxHpc1XHT-eDqkh5YYWMPTSNPLjtEHXQUkfObY-nofRwLFod3WXw== - Go
syscall
package (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEQBi3uwV5G2qWhS-oC8B-8c4BmGdoBbltQP-Yp5nwJT8wlrLIk1E_16UsCv5S7uqOpPO_larEu5hsfYcPe_HuIeKZ5X9St62Fk_PSF5Qg5JMyejvKWGznAHnK-IVHqjWRnxPEonLm5Js5rWR6KTfsF4rWEmd6EIWM8NydZMyB4QMdWiSHTX7vJ0Rud3a0= - Go
syscall
package (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGKximcAY49LlXYboXzYHnWenz7Qt9XBb8VCQwIfoEmXcfGOd8dkYMVYVJtG7u6ICb5g1uth1Ay3A_fz38wqPuNb_YTz4IN91-I2ihX98AdFZAYKHpE54nQ6mIWGjMYPSQsT1rRpyNNvb86bbyWorJkzXnUXNgWc64phpV4hWwkR6MwtwHOW2MCp87OgVvejDYVvR7k= - Go
syscall
package (vertexaisearch.cloud.google.com): https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG6B0xLc_75O0DF-HtNm9_QfnCO1vvMCWB_NMxlZ4jDcYwTRXA3puqBPlZW7mJVvcq0fkvQwgzqhIrwjxU5n491-P7KuM_rivXzTyrRrVCOsBTyIaF0ZLw2uiMbY8cleZFgBfuIe34SbJ_vkd82P08OxdMzvu4XKftc__2URqjikOb5FojBs6Jh6V8ZPtfalQpbYNgZeJVWoI3ikV8KT7RJQP9onKursNPVzJxuTYNXNPiE8SnKhbaZA= - Go
mkerrors.sh
(go.dev): https://go.dev/src/syscall/mkerrors.sh - Go
mkerrors.sh
(github.com): https://github.com/golang/go/blob/master/src/syscall/mkerrors.sh - Go
mkerrors.sh
(go.dev): https://go.dev/src/golang.org/x/sys/unix/mkall.bash - Go
mkerrors.sh
(go.dev): https://go.dev/src/syscall/mkerrors.sh - Go
mkerrors.sh
(leapcell.io): https://www.leapcell.io/blog/go-syscall-package - Go
mkerrors.sh
(reddit.com): https://www.reddit.com/r/golang/comments/10q0q0q/what_is_the_purpose_of_the_go_syscall_package/