// Copyright 2013 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 ipv6

import (
	
	
	

	
	
)

func ( *sockOpt) ( *socket.Conn) (*net.Interface, error) {
	,  := .GetInt()
	if  != nil {
		return nil, 
	}
	return net.InterfaceByIndex()
}

func ( *sockOpt) ( *socket.Conn,  *net.Interface) error {
	var  int
	if  != nil {
		 = .Index
	}
	return .SetInt(, )
}

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

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

func ( *sockOpt) ( *socket.Conn) (*net.Interface, int, error) {
	 := make([]byte, .Len)
	,  := .Get(, )
	if  != nil {
		return nil, 0, 
	}
	if  != sizeofIPv6Mtuinfo {
		return nil, 0, errNotImplemented
	}
	 := (*ipv6Mtuinfo)(unsafe.Pointer(&[0]))
	if .Addr.Scope_id == 0 || runtime.GOOS == "aix" {
		// AIX kernel might return a wrong address.
		return nil, int(.Mtu), nil
	}
	,  := net.InterfaceByIndex(int(.Addr.Scope_id))
	if  != nil {
		return nil, 0, 
	}
	return , int(.Mtu), nil
}

func ( *sockOpt) ( *socket.Conn,  *net.Interface,  net.IP) error {
	switch .typ {
	case ssoTypeIPMreq:
		return .setIPMreq(, , )
	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(, )
}