mirror of
https://github.com/impact-eintr/netstack.git
synced 2025-10-27 14:40:21 +08:00
57 lines
1.3 KiB
Go
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)
|
|
}
|