reason: update license to Mulan PSL v2 Signed-off-by: taleintervenor <taleintervenor@aliyun.com>
112 lines
2.4 KiB
Go
112 lines
2.4 KiB
Go
// Copyright (c) Huawei Technologies Co., Ltd. 2018-2019. All rights reserved.
|
|
// syscontainer-tools is licensed under the Mulan PSL v2.
|
|
// You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
// You may obtain a copy of Mulan PSL v2 at:
|
|
// http://license.coscl.org.cn/MulanPSL2
|
|
// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
|
|
// PURPOSE.
|
|
// See the Mulan PSL v2 for more details.
|
|
// Description: ethtool for network interface
|
|
// Author: zhangwei
|
|
// Create: 2018-01-18
|
|
|
|
package ethtool
|
|
|
|
/*
|
|
#include <stdlib.h>
|
|
#include "ethtool.h"
|
|
*/
|
|
import "C"
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
// Ethtool ethtool interface
|
|
type Ethtool interface {
|
|
SetNetDeviceTSO(on bool) error
|
|
SetNetDeviceTX(on bool) error
|
|
SetNetDeviceSG(on bool) error
|
|
Close() error
|
|
}
|
|
|
|
type ethtool struct {
|
|
fd int
|
|
name string
|
|
sync.Mutex
|
|
}
|
|
|
|
// NewEthtool init ethtool
|
|
func NewEthtool(name string) (Ethtool, error) {
|
|
fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0)
|
|
if err != nil {
|
|
fd, err = syscall.Socket(syscall.AF_NETLINK, syscall.SOCK_RAW, syscall.NETLINK_GENERIC)
|
|
}
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ðtool{fd: fd, name: name}, nil
|
|
}
|
|
|
|
func (etool *ethtool) SetNetDeviceTSO(on bool) error {
|
|
etool.Lock()
|
|
defer etool.Unlock()
|
|
|
|
var cOn C.int
|
|
if on {
|
|
cOn = 1
|
|
}
|
|
|
|
cName := C.CString(etool.name)
|
|
ret := C.setNetDeviceTSO(C.int(etool.fd), cName, cOn)
|
|
C.free(unsafe.Pointer(cName))
|
|
if ret != 0 {
|
|
return fmt.Errorf("setNetDeviceTso return error: %d", ret)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (etool *ethtool) SetNetDeviceTX(on bool) error {
|
|
etool.Lock()
|
|
defer etool.Unlock()
|
|
|
|
var cOn C.int
|
|
if on {
|
|
cOn = 1
|
|
}
|
|
|
|
cName := C.CString(etool.name)
|
|
ret := C.setNetDeviceTX(C.int(etool.fd), cName, cOn)
|
|
C.free(unsafe.Pointer(cName))
|
|
if ret != 0 {
|
|
return fmt.Errorf("setNetDeviceTso return error: %d", ret)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (etool *ethtool) SetNetDeviceSG(on bool) error {
|
|
etool.Lock()
|
|
defer etool.Unlock()
|
|
|
|
var cOn C.int
|
|
if on {
|
|
cOn = 1
|
|
}
|
|
|
|
cName := C.CString(etool.name)
|
|
ret := C.setNetDeviceSG(C.int(etool.fd), cName, cOn)
|
|
C.free(unsafe.Pointer(cName))
|
|
if ret != 0 {
|
|
return fmt.Errorf("setNetDeviceTso return error: %d", ret)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (etool *ethtool) Close() error {
|
|
return syscall.Close(etool.fd)
|
|
}
|