1 # Copyright (c) 2022 Intel and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
14 from ProtocolHeader import *
15 from ForgeResult import *
29 if not os.path.exists(folder):
30 print("folder not exisit")
33 if os.path.exists(folder + "/nodes"):
34 pg.LoadNodesFromDirectory(folder + "/nodes")
35 if os.path.exists(folder + "/edges"):
36 pg.LoadEdgesFromDirectory(folder + "/edges")
38 print("Failed to create Parse Graph")
45 nodes.extend(self.nodeDict.values)
50 edges.extend(self.edgeDict.values)
53 def LoadNodesFromDirectory(self, folder):
54 for root, dirs, files in os.walk(folder):
56 self.LoadNodeFromFile(os.path.join(root, f))
58 def LoadEdgesFromDirectory(self, folder):
59 for root, dirs, files in os.walk(folder):
61 self.LoadEdgeFromFile(os.path.join(root, f))
63 def LoadNodeFromFile(self, file):
65 node = Node.Create(file)
68 print("No node created")
73 print("Failed to create node from " + file)
75 def LoadEdgeFromFile(self, file):
77 edges = Edge.Create(file)
80 print("No edge created")
86 print("Failed to create edge from " + file)
88 def createProtocolHeader(self, name):
89 if name in self.nodeDict:
90 return ProtocolHeader(self.nodeDict[name])
93 def GetNode(self, name):
94 if self.nodeDict.has_key(name):
95 return self.nodeDict[name]
98 def GetEdge(self, start, end):
99 key = start + "-" + end
100 if key in self.edgeDict:
101 return self.edgeDict[key]
104 def AddNode(self, node):
105 if node.Name in self.nodeDict:
106 print("Warning: node {0} already exist", node.Name)
108 self.nodeDict[node.Name] = node
110 def AddEdge(self, edge):
111 key = edge.Start + "-" + edge.End
112 if key in self.edgeDict:
113 print("Warning: edge {0} already exist", key)
114 self.edgeDict[key] = edge
116 def Forge(self, path):
119 # set field value/mask
120 for headerConfig in path.stack:
121 header = self.createProtocolHeader(headerConfig.Header)
126 for hcf in headerConfig.fields:
128 if not header.SetField(hcf.Name, hcf.Value):
129 if not header.SetAttribute(hcf.Name, hcf.Value):
130 print("failed to set value of " + hcf.Name)
135 if not attr and not header.SetMask(hcf.Name, hcf.Mask):
136 print("failed to set mask of " + hcf.Name)
141 headerList.append(header)
143 # apply edge actions and length autoincrease
144 for i in range(1, len(headerList)):
145 start = headerList[i - 1]
148 edge = self.GetEdge(start.Name(), end.Name())
151 print("no edge exist for {0}, {1}", start.Name, end.Name)
154 edge.Apply(start, end)
156 increase = end.GetSize()
158 headerList[j].AppendAuto(increase)
162 for header in headerList:
164 pktLen += len(header.Buffer)
171 for header in headerList:
172 pktbuf.extend(header.Buffer)
173 mskbuf.extend(header.Mask)
175 offset += len(header.Buffer)
177 result = ForgeResult(headerList, pktbuf, mskbuf)