blob: 2508bdeaff399ecc2c546a103c614360d08e9d36 [file] [log] [blame]
Don Newton98fd8812019-09-23 15:15:02 -04001/*
2 Copyright 2017 the original author or authors.
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 openflow
18
19import (
20 "context"
21 "encoding/json"
Don Newtone0d34a82019-11-14 10:58:06 -050022 "log"
23
24 ofp "github.com/donNewtonAlpha/goloxi/of13"
Don Newton98fd8812019-09-23 15:15:02 -040025 "github.com/opencord/voltha-protos/go/openflow_13"
26 pb "github.com/opencord/voltha-protos/go/voltha"
Don Newton98fd8812019-09-23 15:15:02 -040027)
28
29var oxmMap = map[string]int32{
30 "in_port": 0,
31 "in_phy_port": 1,
32 "metadata": 2,
33 "eth_dst": 3,
34 "eth_src": 4,
35 "eth_type": 5,
36 "vlan_vid": 6,
37 "vlan_pcp": 7,
38 "ip_dscp": 8,
39 "ip_ecn": 9,
40 "ip_proto": 10,
41 "ipv4_src": 11,
42 "ipv4_dst": 12,
43 "tcp_src": 13,
44 "tcp_dst": 14,
45 "udp_src": 15,
46 "udp_dst": 16,
47 "sctp_src": 17,
48 "sctp_dst": 18,
49 "icmpv4_type": 19,
50 "icmpv4_code": 20,
51 "arp_op": 21,
52 "arp_spa": 22,
53 "arp_tpa": 23,
54 "arp_sha": 24,
55 "arp_tha": 25,
56 "ipv6_src": 26,
57 "ipv6_dst": 27,
58 "ipv6_flabel": 28,
59 "icmpv6_type": 29,
60 "icmpv6_code": 30,
61 "ipv6_nd_target": 31,
62 "ipv6_nd_sll": 32,
63 "ipv6_nd_tll": 33,
64 "mpls_label": 34,
65 "mpls_tc": 35,
66 "mpls_bos": 36,
67 "pbb_isid": 37,
68 "tunnel_id": 38,
69 "ipv6_exthdr": 39,
70}
71
72func handleFlowAdd(flowAdd *ofp.FlowAdd, deviceId string) {
73 js, _ := json.Marshal(flowAdd)
74 log.Printf("handleFlowAdd called with %s", js)
75
76 var flowUpdate openflow_13.FlowTableUpdate
77 flowUpdate.Id = deviceId
78 var flowMod pb.OfpFlowMod
79 flowMod.Cookie = flowAdd.Cookie
80 flowMod.CookieMask = flowAdd.CookieMask
81 flowMod.TableId = uint32(flowAdd.TableId)
82 flowMod.Command = pb.OfpFlowModCommand_OFPFC_ADD
83 flowMod.IdleTimeout = uint32(flowAdd.IdleTimeout)
84 flowMod.HardTimeout = uint32(flowAdd.HardTimeout)
85 flowMod.Priority = uint32(flowAdd.Priority)
86 flowMod.BufferId = flowAdd.BufferId
87 flowMod.OutPort = uint32(flowAdd.OutPort)
88 flowMod.OutGroup = uint32(flowAdd.OutGroup)
89 flowMod.Flags = uint32(flowAdd.Flags)
90 inMatch := flowAdd.Match
91 var flowMatch pb.OfpMatch
92 flowMatch.Type = pb.OfpMatchType(inMatch.GetType())
93 var oxmList []*pb.OfpOxmField
94 inOxmList := inMatch.GetOxmList()
95 for i := 0; i < len(inOxmList); i++ {
96 oxmField := inOxmList[i]
97 j, _ := json.Marshal(oxmField)
98
99 name := oxmMap[oxmField.GetOXMName()]
100 log.Printf("\n\n\n %s %d %s\n\n\n", j, name, oxmField.GetOXMName())
101
102 val := oxmField.GetOXMValue()
103 var ofpOxmField pb.OfpOxmField
104 ofpOxmField.OxmClass = ofp.OFPXMCOpenflowBasic
105 var field pb.OfpOxmOfbField
106
107 field.Type = pb.OxmOfbFieldTypes(name)
108 log.Println("****\nFieldType: " + openflow_13.OxmOfbFieldTypes_name[name] + "\n\n\n\n")
109
110 var x openflow_13.OfpOxmField_OfbField
111 x.OfbField = &field
112 ofpOxmField.Field = &x
113
114 switch pb.OxmOfbFieldTypes(name) {
115 case pb.OxmOfbFieldTypes_OFPXMT_OFB_IN_PORT:
116 port := val.(ofp.Port)
117 var value pb.OfpOxmOfbField_Port
118 value.Port = uint32(port)
119 field.Value = &value
120 case pb.OxmOfbFieldTypes_OFPXMT_OFB_IN_PHY_PORT:
121 phyPort := val.(uint32)
122 var value pb.OfpOxmOfbField_PhysicalPort
123 value.PhysicalPort = phyPort
124 field.Value = &value
125 case pb.OxmOfbFieldTypes_OFPXMT_OFB_METADATA:
126 metadata := val.(uint64)
127 var value pb.OfpOxmOfbField_TableMetadata
128 value.TableMetadata = metadata
129 field.Value = &value
130 case pb.OxmOfbFieldTypes_OFPXMT_OFB_ETH_TYPE:
131 ethType := val.(ofp.EthernetType)
132 var value pb.OfpOxmOfbField_EthType
133 value.EthType = uint32(ethType)
134 field.Value = &value
135 case pb.OxmOfbFieldTypes_OFPXMT_OFB_IP_PROTO:
136 proto := val.(ofp.IpPrototype)
137 var value pb.OfpOxmOfbField_IpProto
138 value.IpProto = uint32(proto)
139 field.Value = &value
140 case pb.OxmOfbFieldTypes_OFPXMT_OFB_UDP_SRC:
141 udpSrc := val.(uint16)
142 var value pb.OfpOxmOfbField_UdpSrc
143 value.UdpSrc = uint32(udpSrc)
144 log.Printf("udpSrc %v", udpSrc)
145 field.Value = &value
146 case pb.OxmOfbFieldTypes_OFPXMT_OFB_UDP_DST:
147 udpDst := val.(uint16)
148 var value pb.OfpOxmOfbField_UdpDst
149 value.UdpDst = uint32(udpDst)
150 field.Value = &value
Don Newtone0d34a82019-11-14 10:58:06 -0500151 case pb.OxmOfbFieldTypes_OFPXMT_OFB_VLAN_VID:
152 vid := val.(uint16) & 0xfff
153 var value pb.OfpOxmOfbField_VlanVid
154 value.VlanVid = uint32(vid)
155 field.Value = &value
Don Newton98fd8812019-09-23 15:15:02 -0400156 }
157 oxmList = append(oxmList, &ofpOxmField)
158 }
159 flowMatch.OxmFields = oxmList
160 flowMod.Match = &flowMatch
161 var instructions []*pb.OfpInstruction
162 ofpInstructions := flowAdd.GetInstructions()
163 for i := 0; i < len(ofpInstructions); i++ {
164 var instruction pb.OfpInstruction
165 ofpInstruction := ofpInstructions[i]
166 instructionType := ofpInstruction.GetType()
167 instruction.Type = uint32(instructionType)
168 switch instructionType {
Don Newtone0d34a82019-11-14 10:58:06 -0500169 case ofp.OFPITGotoTable:
Don Newton98fd8812019-09-23 15:15:02 -0400170 goToTable := ofpInstruction.(ofp.IInstructionGotoTable)
171 var ofpGoToTable openflow_13.OfpInstruction_GotoTable
Don Newtone0d34a82019-11-14 10:58:06 -0500172 var oGoToTable openflow_13.OfpInstructionGotoTable
173 ofpGoToTable.GotoTable = &oGoToTable
Don Newton98fd8812019-09-23 15:15:02 -0400174 ofpGoToTable.GotoTable.TableId = uint32(goToTable.GetTableId())
175 instruction.Data = &ofpGoToTable
Don Newtone0d34a82019-11-14 10:58:06 -0500176 case ofp.OFPITWriteMetadata:
Don Newton98fd8812019-09-23 15:15:02 -0400177 writeMetaData := ofpInstruction.(ofp.IInstructionWriteMetadata)
178 var ofpWriteMetadata openflow_13.OfpInstruction_WriteMetadata
Don Newtone0d34a82019-11-14 10:58:06 -0500179 var writeMetadata openflow_13.OfpInstructionWriteMetadata
180 ofpWriteMetadata.WriteMetadata = &writeMetadata
Don Newton98fd8812019-09-23 15:15:02 -0400181 ofpWriteMetadata.WriteMetadata.Metadata = writeMetaData.GetMetadata()
182 ofpWriteMetadata.WriteMetadata.MetadataMask = writeMetaData.GetMetadataMask()
183 instruction.Data = &ofpWriteMetadata
Don Newtone0d34a82019-11-14 10:58:06 -0500184 case ofp.OFPITWriteActions:
Don Newton98fd8812019-09-23 15:15:02 -0400185 writeAction := ofpInstruction.(ofp.IInstructionWriteActions)
186 var ofpInstructionActions openflow_13.OfpInstruction_Actions
187 var ofpActions []*openflow_13.OfpAction
188 actions := writeAction.GetActions()
189 for i := 0; i < len(actions); i++ {
190 action := actions[i]
191 ofpAction := extractAction(action)
192 ofpActions = append(ofpActions, ofpAction)
193 }
194 instruction.Data = &ofpInstructionActions
Don Newtone0d34a82019-11-14 10:58:06 -0500195 case ofp.OFPITApplyActions:
Don Newton98fd8812019-09-23 15:15:02 -0400196 applyAction := ofpInstruction.(ofp.IInstructionApplyActions)
197 var ofpInstructionActions openflow_13.OfpInstruction_Actions
198 var ofpActions []*openflow_13.OfpAction
199 actions := applyAction.GetActions()
200 for i := 0; i < len(actions); i++ {
201 action := actions[i]
202 ofpAction := extractAction(action)
203 ofpActions = append(ofpActions, ofpAction)
204 }
205 var actionsHolder openflow_13.OfpInstructionActions
206 actionsHolder.Actions = ofpActions
207 ofpInstructionActions.Actions = &actionsHolder
208 instruction.Data = &ofpInstructionActions
Don Newtone0d34a82019-11-14 10:58:06 -0500209 case ofp.OFPITMeter:
210 var instructionMeter = ofpInstruction.(ofp.IInstructionMeter)
211 var meterInstruction openflow_13.OfpInstruction_Meter
212 var meter openflow_13.OfpInstructionMeter
Don Newton98fd8812019-09-23 15:15:02 -0400213
Don Newtone0d34a82019-11-14 10:58:06 -0500214 meter.MeterId = instructionMeter.GetMeterId()
215 meterInstruction.Meter = &meter
216 instruction.Data = &meterInstruction
Don Newton98fd8812019-09-23 15:15:02 -0400217 }
218 instructions = append(instructions, &instruction)
219 }
220
221 flowMod.Instructions = instructions
222 flowUpdate.FlowMod = &flowMod
223 grpcClient := *getGrpcClient()
224 flowUpdateJs, _ := json.Marshal(flowUpdate)
225 log.Printf("FLOW UPDATE %s", flowUpdateJs)
226 empty, err := grpcClient.UpdateLogicalDeviceFlowTable(context.Background(), &flowUpdate)
227 if err != nil {
228 log.Printf("ERROR DOING FLOW MOD ADD %v", err)
229 }
230 emptyJs, _ := json.Marshal(empty)
231 log.Printf("FLOW MOD RESPONSE %s", emptyJs)
232
233}
234
235func handleFlowMod(flowMod *ofp.FlowMod, deviceId string) {
236 js, _ := json.Marshal(flowMod)
237 log.Printf("handleFlowMod called with %s", js)
238}
239
240func handleFlowModStrict(flowModStrict *ofp.FlowModifyStrict, deviceId string) {
241 js, _ := json.Marshal(flowModStrict)
242 log.Printf("handleFlowModStrict called with %s", js)
243}
244func handleFlowDelete(flowDelete *ofp.FlowDelete, deviceId string) {
245 js, _ := json.Marshal(flowDelete)
246 log.Printf("handleFlowDelete called with %s", js)
247
248}
249func handleFlowDeleteStrict(flowDeleteStrict *ofp.FlowDeleteStrict, deviceId string) {
250 js, _ := json.Marshal(flowDeleteStrict)
251 log.Printf("handleFlowDeleteStrict called with %s", js)
252
253}