// Copyright 2012 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos

package ipv4

import (
	
	

	
	
)

func ( *sockOpt) ( *socket.Conn) (*net.Interface, error) {
	switch .typ {
	case ssoTypeIPMreqn:
		return .getIPMreqn()
	default:
		return .getMulticastIf()
	}
}

func ( *sockOpt) ( *socket.Conn,  *net.Interface) error {
	switch .typ {
	case ssoTypeIPMreqn:
		return .setIPMreqn(, , nil)
	default:
		return .setMulticastIf(, )
	}
}

func ( *sockOpt) ( *socket.Conn) (*ICMPFilter, error) {
	 := make([]byte, .Len)
	,  := .Get(, )
	if  != nil {
		return nil, 
	}
	if  != sizeofICMPFilter {
		return nil, errNotImplemented
	}
	return (*ICMPFilter)(unsafe.Pointer(&[0])), nil
}

func ( *sockOpt) ( *socket.Conn,  *ICMPFilter) error {
	 := (*[sizeofICMPFilter]byte)(unsafe.Pointer())[:sizeofICMPFilter]
	return .Set(, )
}

func ( *sockOpt) ( *socket.Conn,  *net.Interface,  net.IP) error {
	switch .typ {
	case ssoTypeIPMreq:
		return .setIPMreq(, , )
	case ssoTypeIPMreqn:
		return .setIPMreqn(, , )
	case ssoTypeGroupReq:
		return .setGroupReq(, , )
	default:
		return errNotImplemented
	}
}

func ( *sockOpt) ( *socket.Conn,  *net.Interface, ,  net.IP) error {
	return .setGroupSourceReq(, , , )
}

func ( *sockOpt) ( *socket.Conn,  []bpf.RawInstruction) error {
	return .setAttachFilter(, )
}