Example #1
0
    def set_route(self, sid, ip_addr, udp_port, mac_addr=None):
        """
        Sets up routing in the Ethernet dispatcher. From sid, only the
        destination part is important. After this call, any CHDR packet
        reaching this Ethernet dispatcher will get routed to `ip_addr' and
        `udp_port'.

        It automatically looks up the MAC address of the destination unless a
        MAC address is given.

        sid -- Full SID, but only destination part matters.
        ip_addr -- IPv4 destination address. String format ("1.2.3.4").
        udp_addr -- Destination UDP port.
        mac_addr -- If given, this will replace an ARP lookup for the MAC
                    address. String format, ("aa:bb:cc:dd:ee:ff"), case does
                    not matter.
        """
        udp_port = int(udp_port)
        if mac_addr is None:
            mac_addr = get_mac_addr(ip_addr)
        if mac_addr is None:
            self.log.error(
                "Could not resolve a MAC address for IP address `{}'".format(ip_addr)
            )
        dst_ep = sid.dst_ep
        self.log.debug(
            "Routing SID `{sid}' (endpoint `{ep}') to IP address `{ip}', " \
            "MAC address `{mac}', port `{port}'".format(
                sid=str(sid),
                ep=dst_ep,
                ip=ip_addr,
                mac=mac_addr,
                port=udp_port
            )
        )
        ip_addr_int = int(netaddr.IPAddress(ip_addr))
        mac_addr_int = int(netaddr.EUI(mac_addr))
        sid_offset = 4 * dst_ep

        def poke_and_trace(addr, data):
            " Do a poke32() and log.trace() "
            self.log.trace("Writing to address 0x{:04X}: 0x{:04X}".format(
                addr, data
            ))
            self.poke32(addr, data)

        with self._regs:
            poke_and_trace(
                self.SID_IP_OFFSET + sid_offset,
                ip_addr_int
            )
            poke_and_trace(
                self.SID_MAC_LO_OFFSET + sid_offset,
                mac_addr_int & 0xFFFFFFFF,
            )
            poke_and_trace(
                self.SID_PORT_MAC_HI_OFFSET + sid_offset,
                (udp_port << 16) | (mac_addr_int >> 32)
            )
Example #2
0
    def set_route(self, sid, ip_addr, udp_port, mac_addr=None):
        """
        Sets up routing in the Ethernet dispatcher. From sid, only the
        destination part is important. After this call, any CHDR packet
        reaching this Ethernet dispatcher will get routed to `ip_addr' and
        `udp_port'.

        It automatically looks up the MAC address of the destination unless a
        MAC address is given.

        sid -- Full SID, but only destination part matters.
        ip_addr -- IPv4 destination address. String format ("1.2.3.4").
        udp_addr -- Destination UDP port.
        mac_addr -- If given, this will replace an ARP lookup for the MAC
                    address. String format, ("aa:bb:cc:dd:ee:ff"), case does
                    not matter.
        """
        udp_port = int(udp_port)
        if mac_addr is None:
            mac_addr = get_mac_addr(ip_addr)
        if mac_addr is None:
            self.log.error(
                "Could not resolve a MAC address for IP address `{}'".format(
                    ip_addr))
        dst_ep = sid.dst_ep
        self.log.debug(
            "Routing SID `{sid}' (endpoint `{ep}') to IP address `{ip}', " \
            "MAC address `{mac}', port `{port}'".format(
                sid=str(sid),
                ep=dst_ep,
                ip=ip_addr,
                mac=mac_addr,
                port=udp_port
            )
        )
        ip_addr_int = int(netaddr.IPAddress(ip_addr))
        mac_addr_int = int(netaddr.EUI(mac_addr))
        sid_offset = 4 * dst_ep

        def poke_and_trace(addr, data):
            " Do a poke32() and log.trace() "
            self.log.trace("Writing to address 0x{:04X}: 0x{:04X}".format(
                addr, data))
            self.poke32(addr, data)

        with self._regs:
            poke_and_trace(self.SID_IP_OFFSET + sid_offset, ip_addr_int)
            poke_and_trace(
                self.SID_MAC_LO_OFFSET + sid_offset,
                mac_addr_int & 0xFFFFFFFF,
            )
            poke_and_trace(self.SID_PORT_MAC_HI_OFFSET + sid_offset,
                           (udp_port << 16) | (mac_addr_int >> 32))
 def commit_xport(self, sid, xport_info):
     """
     Commit transport
     
     Saves the transport configuration to the device.
     Returns the status of the commit.
     """
     self.log.trace("Sanity checking xport_info %s...", str(xport_info))
     assert xport_info['type'] == 'UDP'
     assert any([
         xport_info['ipv4'] == x['ip_addr']
         for x in itervalues(self._chdr_ifaces)
     ])
     assert xport_info['port'] == str(self.chdr_port)
     assert len(xport_info.get('src_ipv4')) > 5
     assert int(xport_info.get('src_port')) > 0
     sender_addr = xport_info['src_ipv4']
     sender_port = int(xport_info['src_port'])
     self.log.trace("Incoming connection is coming from %s:%d", sender_addr,
                    sender_port)
     mac_addr = net.get_mac_addr(sender_addr)
     if mac_addr is None:
         raise RuntimeError(
             "Could not find MAC address for IP address {}".format(
                 sender_addr))
     self.log.trace("Incoming connection is coming from %s", mac_addr)
     eth_iface = net.ip_addr_to_iface(xport_info['ipv4'], self._chdr_ifaces)
     xbar_port = self.iface_config[eth_iface]['xbar_port']
     self.log.trace("Using Ethernet interface %s, crossbar port %d",
                    eth_iface, xbar_port)
     xbar_iface = lib.xbar.xbar(self.get_xbar_dev(eth_iface))
     xbar_iface.set_route(sid.src_addr, xbar_port)
     self._eth_dispatchers[eth_iface].set_route(sid.reversed(), sender_addr,
                                                sender_port)
     self.log.trace("UDP transport successfully committed!")
     self._previous_block_ep[sid.src_addr] = sid.get_dst_block()
     if xport_info.get('xport_type') == 'TX_DATA':
         self._allocations[eth_iface] = \
             {'tx': self._allocations.get(eth_iface, {}).get('tx', 0) + 1}
     if xport_info.get('xport_type') == 'RX_DATA':
         self._allocations[eth_iface] = \
             {'rx': self._allocations.get(eth_iface, {}).get('rx', 0) + 1}
     self.log.trace(
         "New link allocations for %s: TX: %d  RX: %d",
         eth_iface,
         self._allocations.get(eth_iface, {}).get('tx', 0),
         self._allocations.get(eth_iface, {}).get('rx', 0),
     )
     return True
Example #4
0
 def commit_xport(self, sid, xport_info):
     """
     Commit transport
     
     Saves the transport configuration to the device.
     Returns the status of the commit.
     """
     self.log.trace("Sanity checking xport_info %s...", str(xport_info))
     assert xport_info['type'] == 'UDP'
     assert any([xport_info['ipv4'] == x['ip_addr']
                 for x in itervalues(self._chdr_ifaces)])
     assert xport_info['port'] == str(self.chdr_port)
     assert len(xport_info.get('src_ipv4')) > 5
     assert int(xport_info.get('src_port')) > 0
     sender_addr = xport_info['src_ipv4']
     sender_port = int(xport_info['src_port'])
     self.log.trace("Incoming connection is coming from %s:%d",
                    sender_addr, sender_port)
     mac_addr = net.get_mac_addr(sender_addr)
     if mac_addr is None:
         raise RuntimeError(
             "Could not find MAC address for IP address {}".format(
                 sender_addr))
     self.log.trace("Incoming connection is coming from %s",
                    mac_addr)
     eth_iface = net.ip_addr_to_iface(xport_info['ipv4'], self._chdr_ifaces)
     xbar_port = self.iface_config[eth_iface]['xbar_port']
     self.log.trace("Using Ethernet interface %s, crossbar port %d",
                    eth_iface, xbar_port)
     xbar_iface = lib.xbar.xbar(self.get_xbar_dev(eth_iface))
     xbar_iface.set_route(sid.src_addr, xbar_port)
     self._eth_dispatchers[eth_iface].set_route(
         sid.reversed(), sender_addr, sender_port)
     self.log.trace("UDP transport successfully committed!")
     self._previous_block_ep[sid.src_addr] = sid.get_dst_block()
     if xport_info.get('xport_type') == 'TX_DATA':
         self._allocations[eth_iface] = \
             {'tx': self._allocations.get(eth_iface, {}).get('tx', 0) + 1}
     if xport_info.get('xport_type') == 'RX_DATA':
         self._allocations[eth_iface] = \
             {'rx': self._allocations.get(eth_iface, {}).get('rx', 0) + 1}
     self.log.trace(
         "New link allocations for %s: TX: %d  RX: %d",
         eth_iface,
         self._allocations.get(eth_iface, {}).get('tx', 0),
         self._allocations.get(eth_iface, {}).get('rx', 0),
     )
     return True