Example #1
0
 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
Example #2
0
    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)
Example #3
0
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
Example #4
0
    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
Example #5
0
 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
Example #6
0
 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
Example #7
0
    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)
Example #8
0
    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
Example #9
0
    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)
Example #10
0
    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