You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.9 KiB
62 lines
1.9 KiB
6 months ago
|
package describer
|
||
|
|
||
|
import (
|
||
|
"encoding/hex"
|
||
|
"eruhs/core/parser"
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
type IPv4Describer struct {
|
||
|
IPv4 *parser.IPv4
|
||
|
}
|
||
|
|
||
|
func (i *IPv4Describer) GetHeader() []byte {
|
||
|
return i.IPv4.Header
|
||
|
}
|
||
|
|
||
|
func (i *IPv4Describer) GetDetailDescribe() Describe {
|
||
|
optionDescribe := make([]map[string]string, 0)
|
||
|
for _, option := range i.IPv4.Options {
|
||
|
optionDescribe = append(optionDescribe, map[string]string{
|
||
|
"类型": fmt.Sprintf("%d", option.OptionType),
|
||
|
"长度": fmt.Sprintf("%d", option.OptionLength),
|
||
|
"数据": hex.EncodeToString(option.OptionData),
|
||
|
})
|
||
|
}
|
||
|
|
||
|
protoName := ""
|
||
|
switch i.IPv4.Protocol {
|
||
|
case parser.IPv4ProtoICMP:
|
||
|
protoName = "ICMP"
|
||
|
case parser.IPv4ProtoIGMP:
|
||
|
protoName = "IGMP"
|
||
|
case parser.IPv4ProtoTCP:
|
||
|
protoName = "TCP"
|
||
|
case parser.IPv4ProtoUDP:
|
||
|
protoName = "UDP"
|
||
|
case parser.IPv4ProtoENCAP:
|
||
|
protoName = "ENCAP"
|
||
|
case parser.IPv4ProtoOSPF:
|
||
|
protoName = "OSPF"
|
||
|
case parser.IPv4ProtoSCTP:
|
||
|
protoName = "SCTP"
|
||
|
}
|
||
|
|
||
|
return Describe{
|
||
|
1: {"版本", fmt.Sprintf("%d", i.IPv4.Version)},
|
||
|
2: {"首部长度", fmt.Sprintf("%d", i.IPv4.IHL)},
|
||
|
3: {"区分服务", fmt.Sprintf("%d", i.IPv4.DS)},
|
||
|
4: {"总长", fmt.Sprintf("%d", i.IPv4.TotalLength)},
|
||
|
5: {"标识符", fmt.Sprintf("%d", i.IPv4.Id)},
|
||
|
6: {"标志", fmt.Sprintf("%d", i.IPv4.Flags)},
|
||
|
7: {"分片偏移", fmt.Sprintf("%d", i.IPv4.FragOffset)},
|
||
|
8: {"存活时间", fmt.Sprintf("%d", i.IPv4.TTL)},
|
||
|
9: {"应用层协议", protoName},
|
||
|
10: {"首部校验和", fmt.Sprintf("%d", i.IPv4.Checksum)},
|
||
|
11: {"源地址", i.IPv4.SrcIP.String()},
|
||
|
12: {"目的地址", i.IPv4.DstIP.String()},
|
||
|
13: {"选项字段", fmt.Sprintf("%+v", optionDescribe)},
|
||
|
14: {"填充", fmt.Sprintf("%d Byte", len(i.IPv4.Padding))},
|
||
|
}
|
||
|
}
|