Re: [PATCH v2 12/28] thunderbolt: Add functions for allocating and releasing hop IDs

From: Mika Westerberg
Date: Mon Feb 11 2019 - 03:30:50 EST


On Sun, Feb 10, 2019 at 01:13:53PM +0100, Lukas Wunner wrote:
> On Wed, Feb 06, 2019 at 04:17:22PM +0300, Mika Westerberg wrote:
> > Each port has a separate path configuration space that is used for
> > finding the next hop (switch) in the path. Hop ID is an index to this
> > configuration space and hop IDs 0 - 7 are reserved.
> >
> > In order to get next available hop ID for each direction we provide two
> > pairs of helper functions that can be used to allocate and release hop
> > IDs for a given port.
> [...]
> > +static int tb_port_alloc_hopid(struct tb_port *port, bool in, int min_hopid,
> > + int max_hopid)
> > +{
> > + int port_max_hopid;
> > + struct ida *ida;
> > +
> > + if (in) {
> > + port_max_hopid = port->config.max_in_hop_id;
> > + ida = &port->in_hopids;
> > + } else {
> > + port_max_hopid = port->config.max_out_hop_id;
> > + ida = &port->out_hopids;
> > + }
> > +
> > + /* Hop IDs 0-7 are reserved */
> > + if (min_hopid < 8)
> > + min_hopid = 8;
> > +
> > + if (max_hopid < 0 || max_hopid > port_max_hopid)
> > + max_hopid = port_max_hopid;
> > +
> > + return ida_simple_get(ida, min_hopid, max_hopid + 1, GFP_KERNEL);
> > +}
>
> If there are two Macs at the ends of the daisy-chain with Thunderbolt
> devices in-between, the other Mac may already have established tunnels
> to some of the devices and therefore has occupied hop entries in the
> devices' path config space. How do you ensure that you don't allocate
> the same entries and overwrite the other Mac's hop entries, thereby
> breaking its tunnels?

If the other Mac has enumerated the device (set the upstream port,
route, depth) then the other Mac cannot access the device. You get an
error (we deal with that in the later patch in the series when we
identify XDomain connections). The Hop ID allocation is only relevant in
a single domain. Crossing one needs to have protocol such as we have in
case of ThunderboltIP to negotiate Hop IDs used in the link between two
domains.