# RE: speed specific port cost calculation in br\_if.c and how to make it generic based on 802.1d Table-17-3?

- From: \<hidden\>
- Date: 2012-07-07 05:54:43 
- List: netdev
- Page: https://ratatoskr.run/netdev/2012/07/10899055
- Thread: https://ratatoskr.run/netdev/2012/07/10899055/t.md

```text
Can any one point me on how to go about it?
Parav

> -----Original Message-----
> From: Pandit, Parav
> Sent: Tuesday, July 03, 2012 6:10 PM
> To: <redacted>
> Cc: Parav Pandit
> Subject: speed specific port cost calculation in br_if.c and how to make it
> generic based on 802.1d Table-17-3?
> 
> Hi,
> 
> I am trying to add further support to bridging portion of stack for 40G and
> 100G speeds.
> net/bridge/br_if.c function port_cost() has hard coded values of 2, 4, 19, 100
> for speed of 10G, 1G, 100M, 10Mbps respectively.
> Comment mentions about based on 802.1d standard.
> 
> I am referring to 802.1d-2004 Table 17-3-Port Path Cost values.
> It mentions port cost value of 2000, 20000, 200000 respectively for speed of
> 10G, 1G, 100Mbps respectively.
> This makes sense to me as the post cost value is inversely proportional and
> scalar function of its speed.
> 
> Can anyone please guide me on
> 1. how the current calculation of path/port cost is being done so that I can
> enhance it for other speeds too in generic way if possible?
> 2. How can I incorporate for other speed settings in generic way based on
> 802.1a-2004 spec, Table 17-3?
> 
> Current code snippet:
> /* Determine initial path cost based on speed.
>  * using recommendations from 802.1d standard
>  *
>  * Since driver might sleep need to not be holding any locks.
>  */
> static int port_cost(struct net_device *dev) {
>         struct ethtool_cmd ecmd;
> 
>         if (!__ethtool_get_settings(dev, &ecmd)) {
>                 switch (ethtool_cmd_speed(&ecmd)) {
>                 case SPEED_10000:
>                         return 2;
>                 case SPEED_1000:
>                         return 4;
>                 case SPEED_100:
>                         return 19;
>                 case SPEED_10:
>                         return 100;
>                 }
>         }
> 
>         /* Old silly heuristics based on name */
>         if (!strncmp(dev->name, "lec", 3))
>                 return 7;
> 
>         if (!strncmp(dev->name, "plip", 4))
>                 return 2500;
> 
>         return 100;     /* assume old 10Mbps */
> }
> 
> Regards,
> Parav Pandit
```
