blob: 1fa97bd2fa17b209a90c92fe540b9e82d566bb1c [file] [log] [blame]
Keita NISHIMOTO3b8b9c02018-10-09 09:40:01 +09001/*
2 * Copyright 2018-present Open Networking Foundation
3
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 core
18
19import (
Keita NISHIMOTO3b8b9c02018-10-09 09:40:01 +090020 "github.com/google/gopacket"
21 "github.com/google/gopacket/layers"
22 "github.com/google/gopacket/pcap"
Keita NISHIMOTOc66b8eb2018-10-20 07:19:39 +090023 "gerrit.opencord.org/voltha-bbsim/common"
Keita NISHIMOTOb8417492018-10-19 17:37:38 +090024 "errors"
Keita NISHIMOTO3b8b9c02018-10-09 09:40:01 +090025 "net"
26)
27
28func RecvWorker(io *Ioinfo, handler *pcap.Handle, r chan Packet) {
Keita NISHIMOTOc66b8eb2018-10-20 07:19:39 +090029 logger.Debug("recvWorker runs. handler: %v", *handler)
Keita NISHIMOTO3b8b9c02018-10-09 09:40:01 +090030 packetSource := gopacket.NewPacketSource(handler, handler.LinkType())
31 for packet := range packetSource.Packets() {
Keita NISHIMOTOc66b8eb2018-10-20 07:19:39 +090032 logger.Debug("recv packet from IF: %v \n", *handler)
Keita NISHIMOTO3b8b9c02018-10-09 09:40:01 +090033 //log.Println(packet.Dump())
34 pkt := Packet{}
35 pkt.Info = io
36 pkt.Pkt = packet
37 r <- pkt
38 }
39}
40
41func SendUni(handle *pcap.Handle, packet gopacket.Packet) {
Keita NISHIMOTOb8417492018-10-19 17:37:38 +090042 err := handle.WritePacketData(packet.Data())
43 if err != nil {
Keita NISHIMOTOc66b8eb2018-10-20 07:19:39 +090044 logger.Error("Error in send packet to UNI-IF: %v e:%s\n", *handle, err)
Keita NISHIMOTOb8417492018-10-19 17:37:38 +090045 }
Keita NISHIMOTOc66b8eb2018-10-20 07:19:39 +090046 logger.Debug("Successfully send packet to UNI-IF: %v \n", *handle)
Keita NISHIMOTO3b8b9c02018-10-09 09:40:01 +090047 //log.Println(packet.Dump())
48}
49
50func SendNni(handle *pcap.Handle, packet gopacket.Packet) {
Keita NISHIMOTOb8417492018-10-19 17:37:38 +090051 err := handle.WritePacketData(packet.Data())
52 if err != nil{
Keita NISHIMOTOc66b8eb2018-10-20 07:19:39 +090053 logger.Error("Error in send packet to NNI e:%s\n", err)
Keita NISHIMOTOb8417492018-10-19 17:37:38 +090054 }
Keita NISHIMOTOc66b8eb2018-10-20 07:19:39 +090055 logger.Debug("send packet to NNI-IF: %v \n", *handle)
Keita NISHIMOTO3b8b9c02018-10-09 09:40:01 +090056 //log.Println(packet.Dump())
57}
58
59func PopVLAN(pkt gopacket.Packet) (gopacket.Packet, uint16, error) {
60 if layer := getDot1QLayer(pkt); layer != nil {
61 if eth := getEthernetLayer(pkt); eth != nil {
62 ethernetLayer := &layers.Ethernet{
63 SrcMAC: eth.SrcMAC,
64 DstMAC: eth.DstMAC,
65 EthernetType: layer.Type,
66 }
67 buffer := gopacket.NewSerializeBuffer()
68 gopacket.SerializeLayers(buffer, gopacket.SerializeOptions{},
69 ethernetLayer,
70 gopacket.Payload(layer.Payload),
71 )
72 retpkt := gopacket.NewPacket(
73 buffer.Bytes(),
74 layers.LayerTypeEthernet,
75 gopacket.Default,
76 )
77 vid := uint16(4095 & layer.VLANIdentifier)
Keita NISHIMOTOc66b8eb2018-10-20 07:19:39 +090078 logger.Debug("Pop the 802.1Q header (VID: %d)", vid)
Keita NISHIMOTO3b8b9c02018-10-09 09:40:01 +090079 return retpkt, vid, nil
80 }
81 }
Keita NISHIMOTOc864da22018-10-15 22:41:42 +090082 return pkt, 0, nil
83 //return nil, 0, errors.New("failed to pop vlan")
Keita NISHIMOTO3b8b9c02018-10-09 09:40:01 +090084}
85
86func PushVLAN(pkt gopacket.Packet, vid uint16) (gopacket.Packet, error) {
87 if eth := getEthernetLayer(pkt); eth != nil {
88 ethernetLayer := &layers.Ethernet{
89 SrcMAC: eth.SrcMAC,
90 DstMAC: eth.DstMAC,
91 EthernetType: 0x8100,
92 }
93 dot1qLayer := &layers.Dot1Q{
94 Type: eth.EthernetType,
95 VLANIdentifier: uint16(vid),
96 }
97
98 buffer := gopacket.NewSerializeBuffer()
99 gopacket.SerializeLayers(
100 buffer,
101 gopacket.SerializeOptions{
102 FixLengths: false,
103 },
104 ethernetLayer,
105 dot1qLayer,
106 gopacket.Payload(eth.Payload),
107 )
108 ret := gopacket.NewPacket(
109 buffer.Bytes(),
110 layers.LayerTypeEthernet,
111 gopacket.Default,
112 )
Keita NISHIMOTOc66b8eb2018-10-20 07:19:39 +0900113 logger.Debug("Push the 802.1Q header (VID: %d)", vid)
Keita NISHIMOTO3b8b9c02018-10-09 09:40:01 +0900114 return ret, nil
115 }
116 return nil, errors.New("failed to push vlan")
117}
118
119func getEthernetLayer(pkt gopacket.Packet) *layers.Ethernet {
120 eth := &layers.Ethernet{}
121 if ethLayer := pkt.Layer(layers.LayerTypeEthernet); ethLayer != nil {
122 eth, _ = ethLayer.(*layers.Ethernet)
123 }
124 return eth
125}
126func getDot1QLayer(pkt gopacket.Packet) (dot1q *layers.Dot1Q) {
127 if dot1qLayer := pkt.Layer(layers.LayerTypeDot1Q); dot1qLayer != nil {
128 dot1q = dot1qLayer.(*layers.Dot1Q)
129 }
130 return dot1q
131}
132
133func getMacAddress(ifName string) net.HardwareAddr {
134 var err error
135 var netIf *net.Interface
136 var hwAddr net.HardwareAddr
137 if netIf, err = net.InterfaceByName(ifName); err == nil {
138 hwAddr = netIf.HardwareAddr
139 }
140 return hwAddr
141}