blob: 30ea37f9d2542c35484d659f850a02f6a9b7d21d [file] [log] [blame]
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -07001/*
Joey Armstrong14628cd2023-01-10 08:38:31 -05002 * Copyright 2018-2023 Open Networking Foundation (ONF) and the ONF Contributors
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -07003
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package packetHandlers
18
19import (
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -070020 "errors"
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070021 "github.com/google/gopacket"
22 "github.com/google/gopacket/layers"
23 "net"
24)
25
26func IsDhcpPacket(pkt gopacket.Packet) bool {
27 if layerDHCP := pkt.Layer(layers.LayerTypeDHCPv4); layerDHCP != nil {
28 return true
29 }
30 return false
31}
32
Matteo Scandolo618a6582020-09-09 12:21:29 -070033func IsIgmpPacket(pkt gopacket.Packet) bool {
34 if igmpLayer := pkt.Layer(layers.LayerTypeIGMP); igmpLayer != nil {
35 return true
36 }
37 return false
38}
39
Matteo Scandolo73c488d2019-11-01 14:44:22 -070040func IsLldpPacket(pkt gopacket.Packet) bool {
41 if layer := pkt.Layer(layers.LayerTypeLinkLayerDiscovery); layer != nil {
42 return true
43 }
44 return false
45}
46
Matteo Scandoloec170af2021-10-07 11:53:22 -070047func IsIcmpPacket(pkt gopacket.Packet) bool {
48 if layer := pkt.Layer(layers.LayerTypeICMPv6); layer != nil {
49 return true
50 }
51 return false
52}
53
Matteo Scandolo90d08f62020-10-29 12:06:55 -070054// return true if the packet is coming in the OLT from the DHCP Server
55// given that we only check DHCP packets we can use the Operation
56// Request are outgoing (toward the server)
57// Replies are incoming (toward the OLT)
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070058func IsIncomingPacket(packet gopacket.Packet) bool {
Matteo Scandolo90d08f62020-10-29 12:06:55 -070059 layerDHCP := packet.Layer(layers.LayerTypeDHCPv4)
60 if dhcp, ok := layerDHCP.(*layers.DHCPv4); ok {
61 if dhcp.Operation == layers.DHCPOpReply {
Matteo Scandolo4b3fc7e2019-09-17 16:49:54 -070062 return true
63 }
64 }
65 return false
66}
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -070067
Matteo Scandolo40e067f2019-10-16 16:59:41 -070068// returns the Destination Mac Address contained in the packet
Matteo Scandolof6f3a7f2019-10-11 11:19:29 -070069func GetDstMacAddressFromPacket(packet gopacket.Packet) (net.HardwareAddr, error) {
70 if ethLayer := packet.Layer(layers.LayerTypeEthernet); ethLayer != nil {
71 eth, _ := ethLayer.(*layers.Ethernet)
72
73 if eth.DstMAC != nil {
74 return eth.DstMAC, nil
75 }
76 }
77 return nil, errors.New("cant-find-mac-address")
78}
Matteo Scandolo40e067f2019-10-16 16:59:41 -070079
80// returns the Source Mac Address contained in the packet
81func GetSrcMacAddressFromPacket(packet gopacket.Packet) (net.HardwareAddr, error) {
82 if ethLayer := packet.Layer(layers.LayerTypeEthernet); ethLayer != nil {
83 eth, _ := ethLayer.(*layers.Ethernet)
84
85 if eth.DstMAC != nil {
86 return eth.SrcMAC, nil
87 }
88 }
89 return nil, errors.New("cant-find-mac-address")
90}
91
92// returns wether it's an EAPOL or DHCP packet, error if it's none
Matteo Scandolo618a6582020-09-09 12:21:29 -070093func GetPktType(pkt gopacket.Packet) (PacketType, error) {
Matteo Scandolo40e067f2019-10-16 16:59:41 -070094 if pkt.Layer(layers.LayerTypeEAP) != nil || pkt.Layer(layers.LayerTypeEAPOL) != nil {
95 return EAPOL, nil
96 } else if IsDhcpPacket(pkt) {
97 return DHCP, nil
Matteo Scandolo618a6582020-09-09 12:21:29 -070098 } else if IsIgmpPacket(pkt) {
99 return IGMP, nil
Matteo Scandoloec170af2021-10-07 11:53:22 -0700100 } else if IsIcmpPacket(pkt) {
101 return ICMP, nil
Matteo Scandolo40e067f2019-10-16 16:59:41 -0700102 }
Matteo Scandolo618a6582020-09-09 12:21:29 -0700103 return UNKNOWN, errors.New("unknown-packet-type")
Matteo Scandolo40e067f2019-10-16 16:59:41 -0700104}