Skip to content

Commit d1e684a

Browse files
dennisafaaboch
authored andcommitted
Ability to set multicast attribute on a link
1 parent b239a30 commit d1e684a

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

link.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type LinkAttrs struct {
3636
Statistics *LinkStatistics
3737
Promisc int
3838
Allmulti int
39+
Multi int
3940
Xdp *LinkXdp
4041
EncapType string
4142
Protinfo *Protinfo

link_linux.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,51 @@ func (h *Handle) LinkSetAllmulticastOff(link Link) error {
182182
return err
183183
}
184184

185+
// LinkSetMulticastOn enables the reception of multicast packets for the link device.
186+
// Equivalent to: `ip link set $link multicast on`
187+
func LinkSetMulticastOn(link Link) error {
188+
return pkgHandle.LinkSetMulticastOn(link)
189+
}
190+
191+
// LinkSetMulticastOn enables the reception of multicast packets for the link device.
192+
// Equivalent to: `ip link set $link multicast on`
193+
func (h *Handle) LinkSetMulticastOn(link Link) error {
194+
base := link.Attrs()
195+
h.ensureIndex(base)
196+
req := h.newNetlinkRequest(unix.RTM_NEWLINK, unix.NLM_F_ACK)
197+
198+
msg := nl.NewIfInfomsg(unix.AF_UNSPEC)
199+
msg.Change = unix.IFF_MULTICAST
200+
msg.Flags = unix.IFF_MULTICAST
201+
msg.Index = int32(base.Index)
202+
req.AddData(msg)
203+
204+
_, err := req.Execute(unix.NETLINK_ROUTE, 0)
205+
return err
206+
}
207+
208+
// LinkSetAllmulticastOff disables the reception of multicast packets for the link device.
209+
// Equivalent to: `ip link set $link multicast off`
210+
func LinkSetMulticastOff(link Link) error {
211+
return pkgHandle.LinkSetMulticastOff(link)
212+
}
213+
214+
// LinkSetAllmulticastOff disables the reception of multicast packets for the link device.
215+
// Equivalent to: `ip link set $link multicast off`
216+
func (h *Handle) LinkSetMulticastOff(link Link) error {
217+
base := link.Attrs()
218+
h.ensureIndex(base)
219+
req := h.newNetlinkRequest(unix.RTM_NEWLINK, unix.NLM_F_ACK)
220+
221+
msg := nl.NewIfInfomsg(unix.AF_UNSPEC)
222+
msg.Change = unix.IFF_MULTICAST
223+
msg.Index = int32(base.Index)
224+
req.AddData(msg)
225+
226+
_, err := req.Execute(unix.NETLINK_ROUTE, 0)
227+
return err
228+
}
229+
185230
func MacvlanMACAddrAdd(link Link, addr net.HardwareAddr) error {
186231
return pkgHandle.MacvlanMACAddrAdd(link, addr)
187232
}
@@ -1648,6 +1693,10 @@ func LinkDeserialize(hdr *unix.NlMsghdr, m []byte) (Link, error) {
16481693
if msg.Flags&unix.IFF_ALLMULTI != 0 {
16491694
base.Allmulti = 1
16501695
}
1696+
if msg.Flags&unix.IFF_MULTICAST != 0 {
1697+
base.Multi = 1
1698+
}
1699+
16511700
var (
16521701
link Link
16531702
stats32 *LinkStatistics32

link_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2663,6 +2663,56 @@ func TestLinkSetAllmulticast(t *testing.T) {
26632663
}
26642664
}
26652665

2666+
func TestLinkSetMulticast(t *testing.T) {
2667+
tearDown := setUpNetlinkTest(t)
2668+
defer tearDown()
2669+
2670+
iface := &Veth{LinkAttrs: LinkAttrs{Name: "foo"}, PeerName: "bar"}
2671+
if err := LinkAdd(iface); err != nil {
2672+
t.Fatal(err)
2673+
}
2674+
2675+
link, err := LinkByName("foo")
2676+
if err != nil {
2677+
t.Fatal(err)
2678+
}
2679+
2680+
if err := LinkSetUp(link); err != nil {
2681+
t.Fatal(err)
2682+
}
2683+
2684+
link, err = LinkByName("foo")
2685+
if err != nil {
2686+
t.Fatal(err)
2687+
}
2688+
2689+
if err := LinkSetMulticastOn(link); err != nil {
2690+
t.Fatal(err)
2691+
}
2692+
2693+
link, err = LinkByName("foo")
2694+
if err != nil {
2695+
t.Fatal(err)
2696+
}
2697+
2698+
if link.Attrs().Multi != 1 {
2699+
t.Fatal("IFF_MULTICAST was not set")
2700+
}
2701+
2702+
if err := LinkSetMulticastOff(link); err != nil {
2703+
t.Fatal(err)
2704+
}
2705+
2706+
link, err = LinkByName("foo")
2707+
if err != nil {
2708+
t.Fatal(err)
2709+
}
2710+
2711+
if link.Attrs().Multi != 0 {
2712+
t.Fatal("IFF_MULTICAST is still set")
2713+
}
2714+
}
2715+
26662716
func TestLinkSetMacvlanMode(t *testing.T) {
26672717
tearDown := setUpNetlinkTest(t)
26682718
defer tearDown()

0 commit comments

Comments
 (0)