Files
netstack/tcpip/header/eth.go
impact-eintr b208476302 tcp
2021-09-03 11:48:39 +08:00

57 lines
1.3 KiB
Go

package header
import (
"encoding/binary"
"github.com/impact-eintr/netstack/tcpip"
)
// 以太网帧头部信息的偏移量
const (
dstMAC = 0
srcMAC = 6
ethType = 12
)
// 表示链路层以太网帧的头部
type EthernetFields struct {
// 源地址
SrcAddr tcpip.LinkAddress
// 目标地址
DstAddr tcpip.LinkAddress
// 协议类型
Type tcpip.NetworkProtocolNumber
}
// 以太网数据包的封装
type Ethernet []byte
const (
// 以太网帧最小的长度
EthernetMinimumSize = 14
// 以太网帧的长度
EthernetAddressSize = 6
)
// 从帧头部获取源地址
func (b Ethernet) SourceAddress() tcpip.LinkAddress {
return tcpip.LinkAddress(b[srcMAC:][:EthernetAddressSize])
}
// 从帧头部获取目的地址
func (b Ethernet) DestinationAddress() tcpip.LinkAddress {
return tcpip.LinkAddress(b[dstMAC:][:EthernetAddressSize])
}
// 从帧头部获取协议类型
func (b Ethernet) Type() tcpip.NetworkProtocolNumber {
return tcpip.NetworkProtocolNumber(binary.BigEndian.Uint16(b[ethType:]))
}
// Encode根据传入的帧头部信息编码成Ethernet二进制形式
func (b Ethernet) Encode(e *EthernetFields) {
binary.BigEndian.PutUint16(b[ethType:], uint16(e.Type))
copy(b[srcMAC:][:EthernetAddressSize], e.SrcAddr)
copy(b[dstMAC:][:EthernetAddressSize], e.DstAddr)
}