Skip to content
This repository was archived by the owner on Jun 27, 2018. It is now read-only.

Commit 0b645c0

Browse files
author
Joshua Reich
committed
OPPL (Omid's Packet Processing Library) is a go!
Merge branch 'ryu-merged' into dev-master
2 parents a358120 + 993f873 commit 0b645c0

File tree

546 files changed

+143604
-210
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

546 files changed

+143604
-210
lines changed

mininet/extra-topos.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
class ChainTopo(Topo):
55

6-
def __init__(self, numSwitches, numClients, numServers=0):
6+
def __init__(self, numSwitches, numClients, numServers=0, noIP=False):
77

88
# Add default members to class.
99
super(ChainTopo, self ).__init__()
@@ -15,16 +15,19 @@ def __init__(self, numSwitches, numClients, numServers=0):
1515
client_ids = ['h'+str(i) for i in range(1,numClients+1)]
1616
server_ids = ['hs'+str(i) for i in range(1,numServers+1)]
1717

18-
self.add_hosts(client_ids + server_ids)
18+
self.add_hosts(client_ids + server_ids,noIP)
1919
self.connect_hosts(switch_inds,client_ids,server_ids)
2020

2121
def add_switches(self,switch_inds):
2222
for i in switch_inds:
2323
self.addSwitch('s'+str(i))
2424

25-
def add_hosts(self,host_ids):
25+
def add_hosts(self,host_ids,noIP):
2626
for i in host_ids:
27-
self.addHost(i)
27+
if not noIP:
28+
self.addHost(i)
29+
else:
30+
self.addHost(i,ip=None)
2831

2932
def connect_switches(self,switch_ids):
3033

of_client/pox_client.py

Lines changed: 4 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040

4141
from pyretic.backend.comm import *
4242

43-
4443
def inport_value_hack(outport):
4544
if outport > 1:
4645
return 1
@@ -135,120 +134,11 @@ def __init__(self,show_traces=False,debug_packet_in=False,ip='127.0.0.1',port=BA
135134
self.backend_channel = BackendChannel(ip, port, self)
136135
self.adjacency = {} # From Link to time.time() stamp
137136

138-
def packet_from_network(self, switch, inport, raw):
139-
h = {}
140-
h["switch"] = switch
141-
h["inport"] = inport
142-
143-
p = packetlib.ethernet(raw)
144-
h["header_len"] = p.hdr_len
145-
h["payload_len"] = p.payload_len
146-
h["srcmac"] = p.src.toRaw()
147-
h["dstmac"] = p.dst.toRaw()
148-
h["ethtype"] = p.type
149-
150-
p = p.next
151-
if isinstance(p, packetlib.vlan):
152-
h['vlan_id'] = p.id
153-
h['vlan_pcp'] = p.pcp
154-
h["ethtype"] = p.eth_type
155-
p = p.next
156-
157-
if isinstance(p, packetlib.ipv4):
158-
h["srcip"] = p.srcip.toRaw()
159-
h["dstip"] = p.dstip.toRaw()
160-
h["protocol"] = p.protocol
161-
h["tos"] = p.tos
162-
p = p.next
163-
164-
if isinstance(p, packetlib.udp) or isinstance(p, packetlib.tcp):
165-
h["srcport"] = p.srcport
166-
h["dstport"] = p.dstport
167-
elif isinstance(p, packetlib.icmp):
168-
h["srcport"] = p.type
169-
h["dstport"] = p.code
170-
elif isinstance(p, packetlib.arp):
171-
if p.opcode <= 255:
172-
h["ethtype"] = packetlib.ethernet.ARP_TYPE
173-
h["protocol"] = p.opcode
174-
h["srcip"] = p.protosrc.toRaw()
175-
h["dstip"] = p.protodst.toRaw()
176-
177-
h["raw"] = raw
178-
return h
179-
180-
def make_arp(self, packet):
181-
p = packetlib.ethernet()
182-
p.src = packet["srcmac"]
183-
p.dst = packet["dstmac"]
184-
185-
p.type = packetlib.ethernet.ARP_TYPE
186-
p.next = packetlib.arp(prev=p)
187-
188-
p.next.hwsrc = packet["srcmac"]
189-
p.next.hwdst = packet["dstmac"]
190-
p.next.protosrc = packet["srcip"]
191-
p.next.protodst = packet["dstip"]
192-
p.next.opcode = packet['protocol']
193-
194-
return p
195-
137+
def packet_from_network(self, **kwargs):
138+
return kwargs
196139

197140
def packet_to_network(self, packet):
198-
if len(packet["raw"]) == 0:
199-
if packet["ethtype"] == packetlib.ethernet.ARP_TYPE:
200-
p_begin = p = self.make_arp(packet)
201-
else: # BLANK PACKET FOR NOW - MAY NEED TO SUPPORT OTHER PACKETS LATER
202-
p_begin = p = packetlib.ethernet()
203-
else:
204-
p_begin = p = packetlib.ethernet(packet["raw"])
205-
206-
# ETHERNET PACKET IS OUTERMOST
207-
p.src = packet["srcmac"]
208-
p.dst = packet["dstmac"]
209-
210-
if 'vlan_id' in packet:
211-
if isinstance(p.next, packetlib.vlan):
212-
p = p.next
213-
else:
214-
# Make a vlan header
215-
old_eth_type = p.type
216-
p.type = 0x8100
217-
p.next = packetlib.vlan(next=p.next)
218-
p = p.next
219-
p.eth_type = old_eth_type
220-
p.id = packet['vlan_id']
221-
p.pcp = packet['vlan_pcp']
222-
else:
223-
if isinstance(p.next, packetlib.vlan):
224-
p.type = p.next.eth_type # Restore encapsulated eth type
225-
p.next = p.next.next # Remove vlan from header
226-
227-
# GET PACKET INSIDE ETHERNET/VLAN
228-
p = p.next
229-
if isinstance(p, packetlib.ipv4):
230-
p.srcip = packet["srcip"]
231-
p.dstip = packet["dstip"]
232-
p.protocol = packet["protocol"]
233-
p.tos = packet["tos"]
234-
235-
p = p.next
236-
if isinstance(p, packetlib.udp) or isinstance(p, packetlib.tcp):
237-
p.srcport = packet["srcport"]
238-
p.dstport = packet["dstport"]
239-
elif isinstance(p, packetlib.icmp):
240-
p.type = packet["srcport"]
241-
p.code = packet["dstport"]
242-
243-
elif isinstance(p, packetlib.arp):
244-
if 'vlan_id' in packet:
245-
p.opcode = packet["protocol"]
246-
p.protosrc = packet["srcip"]
247-
p.protodst = packet["dstip"]
248-
else:
249-
p_begin = self.make_arp(packet)
250-
251-
return p_begin.pack()
141+
return packet['raw']
252142

253143
def _handle_ComponentRegistered (self, event):
254144
if event.name == "openflow":
@@ -759,7 +649,7 @@ def _handle_PacketIn(self, event):
759649
print "dpid\t%s" % event.dpid
760650
print
761651

762-
received = self.packet_from_network(event.dpid, event.ofp.in_port, event.data)
652+
received = self.packet_from_network(switch=event.dpid, inport=event.ofp.in_port, raw=event.data)
763653
self.send_to_pyretic(['packet',received])
764654

765655

pyretic/core/network.py

Lines changed: 1 addition & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ def __hash__(self):
7474
def __repr__(self):
7575
return "%s/%d" % (repr(self.pattern),self.masklen)
7676

77-
7877
class IPAddr(object):
7978
def __init__(self, ip):
8079

@@ -187,93 +186,9 @@ def __ne__(self, other):
187186
class MAC(EthAddr):
188187
pass
189188

190-
191189
################################################################################
192-
# Packet and tools
190+
# Tools
193191
################################################################################
194-
195-
196-
class Packet(object):
197-
__slots__ = ["header"]
198-
199-
def __init__(self, state={}):
200-
self.header = util.frozendict(state)
201-
202-
def available_fields(self):
203-
return self.header.keys()
204-
205-
def __eq__(self, other):
206-
return ( id(self) == id(other)
207-
or ( isinstance(other, self.__class__)
208-
and self.header == other.header ) )
209-
210-
def __ne__(self, other):
211-
return not (self == other)
212-
213-
def modify(self, **kwargs):
214-
return self.modifymany(kwargs)
215-
216-
def modifymany(self, d):
217-
add = {}
218-
delete = []
219-
for k, v in d.items():
220-
if v is None:
221-
delete.append(k)
222-
else:
223-
add[k] = v
224-
return Packet(self.header.update(add).remove(delete))
225-
226-
def __getitem__(self, item):
227-
return self.header[item]
228-
229-
def __hash__(self):
230-
return hash(self.header)
231-
232-
def __repr__(self):
233-
import hashlib
234-
fixed_fields = {}
235-
fixed_fields['location'] = ['switch', 'inport', 'outport']
236-
fixed_fields['vlocation'] = ['vswitch', 'vinport', 'voutport']
237-
fixed_fields['source'] = ['srcip', 'srcmac']
238-
fixed_fields['dest'] = ['dstip', 'dstmac']
239-
order = ['location','vlocation','source','dest']
240-
all_fields = self.header.keys()
241-
outer = []
242-
size = max(map(len, self.header) or map(len, order) or [len('md5'),0]) + 3
243-
### LOCATION, VLOCATION, SOURCE, and DEST - EACH ON ONE LINE
244-
for fields in order:
245-
inner = ["%s:%s" % (fields, " " * (size - len(fields)))]
246-
all_none = True
247-
for field in fixed_fields[fields]:
248-
try:
249-
all_fields.remove(field)
250-
except:
251-
pass
252-
try:
253-
inner.append(repr(self.header[field]))
254-
all_none = False
255-
except KeyError:
256-
inner.append('None')
257-
if not all_none:
258-
outer.append('\t'.join(inner))
259-
### MD5 OF PAYLOAD
260-
field = 'raw'
261-
outer.append("%s:%s%s" % ('md5',
262-
" " * (size - len(field)),
263-
hashlib.md5(self.header[field]).hexdigest()))
264-
all_fields.remove(field)
265-
### ANY ADDITIONAL FIELDS
266-
for field in sorted(all_fields):
267-
try:
268-
if self.header[field]:
269-
outer.append("%s:%s\t%s" % (field,
270-
" " * (size - len(field)),
271-
repr(self.header[field])))
272-
except KeyError:
273-
pass
274-
return "\n".join(outer)
275-
276-
277192
class Port(object):
278193
def __init__(self, port_no, config=True, status=True,linked_to=None):
279194
self.port_no = port_no

0 commit comments

Comments
 (0)