def __init__(self, length, prefix, _4or6=4): self.length = length self.prefix = prefix # the human readable string if _4or6 == 4: self.string = convert.bin_to_ipv4(self.prefix) elif _4or6 == 6: self.string = convert.bin_to_ipv6(self.prefix) self._4or6 = _4or6
def _test(self): while True: print 'looping...' #for k,v in BGPer.peers.iteritems(): # print k, v for i in Server.route_table: print i._4or6 print convert.bin_to_ipv4(i.ip) if i._4or6 == 4 else \ convert.bin_to_ipv6(i.ip) print i.attributes.as_path hub.sleep(3)
def equal(dest_addr, route_entry): if route_entry._4or6 == 4: print dest_addr, convert.bin_to_ipv4(route_entry.ip) dest_addr = convert.ipv4_to_int(dest_addr) return convert.ipv4_in_network(dest_addr, route_entry.ip, \ route_entry.prefix_len) elif route_entry._4or6 == 6: print dest_addr, convert.bin_to_ipv6(route_entry.ip) dest_addr = convert.ipv6_to_bin(dest_addr) return convert.ipv6_in_network(dest_addr, route_entry.ip, \ route_entry.prefix_len) else: return False
def parser(cls, buf, offset): (flag, code) = struct.unpack_from('!BB', buf, offset) if ((flag & 0x10) == 0x10): cls._PACK_STR = '!BBH' cls._MIN_LEN = struct.calcsize(cls._PACK_STR) else: cls._PACK_STR = '!BBB' cls._MIN_LEN = struct.calcsize(cls._PACK_STR) (flag, code, length) = struct.unpack_from(cls._PACK_STR, buf, offset) offset += cls._MIN_LEN if length >= 4: (addr_family, sub_addr_family, next_hop_len) = struct.unpack_from('!HBB', buf, offset) offset += 4 next_hop = [] if next_hop_len == 4: (temp_next_hop, ) = struct.unpack_from('!I', buf, offset) offset += 4 next_hop.append(convert.ipv4_to_str(temp_next_hop)) else: if next_hop_len / 16 != 0: for i in range(next_hop_len / 16): (temp_next_hop, ) = struct.unpack_from('!16s', buf, offset) offset += 16 next_hop.append(convert.bin_to_ipv6(temp_next_hop)) if len(buf) > offset: # as SNPA is obselete, jump over this field (num_of_snpas, ) = struct.unpack_from('!B', buf, offset) offset += 1 if num_of_snpas != 0: for i in range(num_of_snpas): (len_of_snap, ) = struct.unpack_from('!B', buf, offset) offset += 1 + len_of_snap # the "5" includes AF(2), SAFI(1), len of next_hop_len(1), # and reserved(1) nlri_len = length - 5 - next_hop_len # we could safely assume it's IPv6 here nlri = NLRI.parser(buf, offset, nlri_len, 6) msg = cls(flag, code, length, addr_family, sub_addr_family, next_hop_len, next_hop, nlri) return msg
def find_switch_of_network(self, dst_addr, _4or6): for dpid, switch in self.dpid_to_switch.iteritems(): for port_no, port in switch.ports.iteritems(): if _4or6 == 4: if port.gateway and convert.ipv4_in_network(dst_addr, port.gateway.gw_ip, port.gateway.prefixlen): if dst_addr == port.gateway.gw_ip: return self.dpid_to_switch[dpid], \ ofproto_v1_0.OFPP_LOCAL return self.dpid_to_switch[dpid], port_no else: if port.gateway and convert.ipv6_in_network(dst_addr, port.gateway.gw_ipv6, port.gateway.ipv6prefixlen): if dst_addr == port.gateway.gw_ipv6: return self.dpid_to_switch[dpid], \ ofproto_v1_0.OFPP_LOCAL print 'out:', convert.bin_to_ipv6(dst_addr), port_no return self.dpid_to_switch[dpid], port_no return None, None
def find_switch_of_network(self, dst_addr, _4or6): for dpid, switch in self.dpid_to_switch.iteritems(): for port_no, port in switch.ports.iteritems(): if _4or6 == 4: if port.gateway and convert.ipv4_in_network( dst_addr, port.gateway.gw_ip, port.gateway.prefixlen): if dst_addr == port.gateway.gw_ip: return self.dpid_to_switch[dpid], \ ofproto_v1_0.OFPP_LOCAL return self.dpid_to_switch[dpid], port_no else: if port.gateway and convert.ipv6_in_network( dst_addr, port.gateway.gw_ipv6, port.gateway.ipv6prefixlen): if dst_addr == port.gateway.gw_ipv6: return self.dpid_to_switch[dpid], \ ofproto_v1_0.OFPP_LOCAL print 'out:', convert.bin_to_ipv6(dst_addr), port_no return self.dpid_to_switch[dpid], port_no return None, None
def __str__(self): return 'Gateway<name=%s,gw_ip=%s,gw_ipv6=%s,port_num=%s,\ prefixLen=%s,ipv6prefixlen=%s,border=%s>' % ( self.port_name, convert.ipv4_to_str(self.gw_ip), convert.bin_to_ipv6(self.gw_ipv6), self.port_num, self.prefixlen, self.ipv6prefixlen, self.border)
def _handle_icmpv6(self, msg, pkt, icmpv6_pkt): #print 'icmpv6', icmpv6_pkt switch = self.dpid_to_switch[msg.datapath.id] in_port_no = msg.in_port if icmpv6_pkt.type_ == icmpv6.ND_NEIGHBOR_ADVERT: gateway = switch.ports[in_port_no].gateway pop_list = [] ipv6_pkt = self.find_packet(pkt, 'ipv6') if gateway and gateway.gw_ipv6 == ipv6_pkt.dst: self._remember_mac_addr(switch, pkt, 6) for i in xrange(len(switch.msg_buffer)): msg, pkt, outport_no, _4or6 = switch.msg_buffer[i] if self.last_switch_out(msg, pkt, outport_no, _4or6): pop_list.append(i) pop_list.sort(reverse = True) for i in pop_list: switch.msg_buffer.pop(i) return True return False elif icmpv6_pkt.type_ == icmpv6.ND_NEIGHBOR_SOLICIT: port = switch.ports[in_port_no] if port.gateway and icmpv6_pkt.data.dst != port.gateway.gw_ipv6: print convert.bin_to_ipv6(icmpv6_pkt.data.dst) print convert.bin_to_ipv6(port.gateway.gw_ipv6) return False #send a ND_NEIGHBOR_REPLY packet ether_layer = self.find_packet(pkt, 'ethernet') ether_dst = ether_layer.src ether_src = port.hw_addr e = ethernet.ethernet(ether_dst,ether_src,ether.ETH_TYPE_IPV6) ic6_data_data = icmpv6.nd_option_la(hw_src=ether_src, data=None) #res = 3 or 7 ic6_data = icmpv6.nd_neighbor(res=3,dst=icmpv6_pkt.data.dst, type_=icmpv6.nd_neighbor.ND_OPTION_TLA,length=1, data=ic6_data_data) ic6 = icmpv6.icmpv6(type_=icmpv6.ND_NEIGHBOR_ADVERT,code=0, csum=0,data=ic6_data) #payload_length ipv6_pkt = self.find_packet(pkt, 'ipv6') i6 = ipv6.ipv6(version= 6,traffic_class=0,flow_label=0, payload_length=32,nxt=58,hop_limit=255, src=icmpv6_pkt.data.dst,dst=ipv6_pkt.src) p = packet.Packet() p.add_protocol(e) p.add_protocol(i6) p.add_protocol(ic6) p.serialize() datapath = msg.datapath datapath.send_packet_out(in_port=ofproto_v1_0.OFPP_NONE, actions= [datapath.ofproto_parser.OFPActionOutput(in_port_no)], data=p.data) print 'send a NA packet' return True elif icmpv6_pkt.type_ == icmpv6.ICMPV6_ECHO_REQUEST: ipv6_pkt = self.find_packet(pkt, 'ipv6') need_reply = False for _k, p in switch.ports.iteritems(): if p.gateway and p.gateway.gw_ipv6 == ipv6_pkt.dst: need_reply = True break if not need_reply: return False ether_layer = self.find_packet(pkt, 'ethernet') ether_dst = ether_layer.src ether_src = switch.ports[in_port_no].hw_addr e = ethernet.ethernet(ether_dst,ether_src,ether.ETH_TYPE_IPV6) ic6_data = icmpv6_pkt.data ic6 = icmpv6.icmpv6(type_=icmpv6.ICMPV6_ECHO_REPLY,code=0, csum=0,data=ic6_data) i6 = ipv6.ipv6(version= 6,traffic_class=0,flow_label=0, payload_length=64,nxt=58,hop_limit=64, src=ipv6_pkt.dst,dst=ipv6_pkt.src) p = packet.Packet() p.add_protocol(e) p.add_protocol(i6) p.add_protocol(ic6) p.serialize() datapath = msg.datapath datapath.send_packet_out(in_port=ofproto_v1_0.OFPP_NONE, actions= [datapath.ofproto_parser.OFPActionOutput(in_port_no)], data=p.data) print 'send a ping6 reply packet' return True return False
def __str__(self): return 'Gateway<name=%s,gw_ip=%s,gw_ipv6=%s,port_num=%s,\ prefixLen=%s,ipv6prefixlen=%s,border=%s>' % ( self.port_name, convert.ipv4_to_str( self.gw_ip), convert.bin_to_ipv6(self.gw_ipv6), self.port_num, self.prefixlen, self.ipv6prefixlen, self.border)
def _handle_icmpv6(self, msg, pkt, icmpv6_pkt): #print 'icmpv6', icmpv6_pkt switch = self.dpid_to_switch[msg.datapath.id] in_port_no = msg.in_port if icmpv6_pkt.type_ == icmpv6.ND_NEIGHBOR_ADVERT: gateway = switch.ports[in_port_no].gateway pop_list = [] ipv6_pkt = self.find_packet(pkt, 'ipv6') if gateway and gateway.gw_ipv6 == ipv6_pkt.dst: self._remember_mac_addr(switch, pkt, 6) for i in xrange(len(switch.msg_buffer)): msg, pkt, outport_no, _4or6 = switch.msg_buffer[i] if self.last_switch_out(msg, pkt, outport_no, _4or6): pop_list.append(i) pop_list.sort(reverse=True) for i in pop_list: switch.msg_buffer.pop(i) return True return False elif icmpv6_pkt.type_ == icmpv6.ND_NEIGHBOR_SOLICIT: port = switch.ports[in_port_no] if port.gateway and icmpv6_pkt.data.dst != port.gateway.gw_ipv6: print convert.bin_to_ipv6(icmpv6_pkt.data.dst) print convert.bin_to_ipv6(port.gateway.gw_ipv6) return False #send a ND_NEIGHBOR_REPLY packet ether_layer = self.find_packet(pkt, 'ethernet') ether_dst = ether_layer.src ether_src = port.hw_addr e = ethernet.ethernet(ether_dst, ether_src, ether.ETH_TYPE_IPV6) ic6_data_data = icmpv6.nd_option_la(hw_src=ether_src, data=None) #res = 3 or 7 ic6_data = icmpv6.nd_neighbor( res=3, dst=icmpv6_pkt.data.dst, type_=icmpv6.nd_neighbor.ND_OPTION_TLA, length=1, data=ic6_data_data) ic6 = icmpv6.icmpv6(type_=icmpv6.ND_NEIGHBOR_ADVERT, code=0, csum=0, data=ic6_data) #payload_length ipv6_pkt = self.find_packet(pkt, 'ipv6') i6 = ipv6.ipv6(version=6, traffic_class=0, flow_label=0, payload_length=32, nxt=58, hop_limit=255, src=icmpv6_pkt.data.dst, dst=ipv6_pkt.src) p = packet.Packet() p.add_protocol(e) p.add_protocol(i6) p.add_protocol(ic6) p.serialize() datapath = msg.datapath datapath.send_packet_out( in_port=ofproto_v1_0.OFPP_NONE, actions=[datapath.ofproto_parser.OFPActionOutput(in_port_no)], data=p.data) print 'send a NA packet' return True elif icmpv6_pkt.type_ == icmpv6.ICMPV6_ECHO_REQUEST: ipv6_pkt = self.find_packet(pkt, 'ipv6') need_reply = False for _k, p in switch.ports.iteritems(): if p.gateway and p.gateway.gw_ipv6 == ipv6_pkt.dst: need_reply = True break if not need_reply: return False ether_layer = self.find_packet(pkt, 'ethernet') ether_dst = ether_layer.src ether_src = switch.ports[in_port_no].hw_addr e = ethernet.ethernet(ether_dst, ether_src, ether.ETH_TYPE_IPV6) ic6_data = icmpv6_pkt.data ic6 = icmpv6.icmpv6(type_=icmpv6.ICMPV6_ECHO_REPLY, code=0, csum=0, data=ic6_data) i6 = ipv6.ipv6(version=6, traffic_class=0, flow_label=0, payload_length=64, nxt=58, hop_limit=64, src=ipv6_pkt.dst, dst=ipv6_pkt.src) p = packet.Packet() p.add_protocol(e) p.add_protocol(i6) p.add_protocol(ic6) p.serialize() datapath = msg.datapath datapath.send_packet_out( in_port=ofproto_v1_0.OFPP_NONE, actions=[datapath.ofproto_parser.OFPActionOutput(in_port_no)], data=p.data) print 'send a ping6 reply packet' return True return False