Changeset 47998


Ignore:
Timestamp:
2015-12-23T20:24:45+01:00 (2 years ago)
Author:
blogic
Message:

swconfig: support receiving SWITCH_TYPE_LINK from kernel

When using cli, print link state the same way kernel used to do it.
This will allow kernel switching PORT_LINK from SWITCH_TYPE_STRING.

Signed-off-by: Rafał Miłecki <zajec5@…>

Location:
trunk/package/network/config/swconfig/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/network/config/swconfig/src/cli.c

    r39229 r47998  
    8585} 
    8686 
     87static const char * 
     88speed_str(int speed) 
     89{ 
     90        switch (speed) { 
     91        case 10: 
     92                return "10baseT"; 
     93        case 100: 
     94                return "100baseT"; 
     95        case 1000: 
     96                return "1000baseT"; 
     97        default: 
     98                break; 
     99        } 
     100 
     101        return "unknown"; 
     102} 
     103 
    87104static void 
    88105print_attr_val(const struct switch_attr *attr, const struct switch_val *val) 
    89106{ 
     107        struct switch_port_link *link; 
    90108        int i; 
    91109 
     
    104122                                 SWLIB_PORT_FLAG_TAGGED) ? "t" : ""); 
    105123                } 
     124                break; 
     125        case SWITCH_TYPE_LINK: 
     126                link = val->value.link; 
     127                if (link->link) 
     128                        printf("port:%d link:up speed:%s %s-duplex %s%s%s%s%s", 
     129                                val->port_vlan, 
     130                                speed_str(link->speed), 
     131                                link->duplex ? "full" : "half", 
     132                                link->tx_flow ? "txflow " : "", 
     133                                link->rx_flow ? "rxflow " : "", 
     134                                link->eee & SWLIB_LINK_FLAG_EEE_100BASET ? "eee100 " : "", 
     135                                link->eee & SWLIB_LINK_FLAG_EEE_1000BASET ? "eee1000 " : "", 
     136                                link->aneg ? "auto" : ""); 
     137                else 
     138                        printf("port:%d link:down", val->port_vlan); 
    106139                break; 
    107140        default: 
  • trunk/package/network/config/swconfig/src/swlib.c

    r46275 r47998  
    5252}; 
    5353 
     54static struct nla_policy link_policy[SWITCH_LINK_ATTR_MAX] = { 
     55        [SWITCH_LINK_FLAG_LINK] = { .type = NLA_FLAG }, 
     56        [SWITCH_LINK_FLAG_DUPLEX] = { .type = NLA_FLAG }, 
     57        [SWITCH_LINK_FLAG_ANEG] = { .type = NLA_FLAG }, 
     58        [SWITCH_LINK_SPEED] = { .type = NLA_U32 }, 
     59        [SWITCH_LINK_FLAG_EEE_100BASET] = { .type = NLA_FLAG }, 
     60        [SWITCH_LINK_FLAG_EEE_1000BASET] = { .type = NLA_FLAG }, 
     61}; 
     62 
    5463static inline void * 
    5564swlib_alloc(size_t size) 
     
    203212 
    204213static int 
     214store_link_val(struct nl_msg *msg, struct nlattr *nla, struct switch_val *val) 
     215{ 
     216        struct nlattr *tb[SWITCH_LINK_ATTR_MAX + 1]; 
     217        struct switch_port_link *link; 
     218        int err = 0; 
     219 
     220        if (!val->value.link) 
     221                val->value.link = malloc(sizeof(struct switch_port_link)); 
     222 
     223        err = nla_parse_nested(tb, SWITCH_LINK_ATTR_MAX, nla, link_policy); 
     224        if (err < 0) 
     225                goto out; 
     226 
     227        link = val->value.link; 
     228        link->link = !!tb[SWITCH_LINK_FLAG_LINK]; 
     229        link->duplex = !!tb[SWITCH_LINK_FLAG_DUPLEX]; 
     230        link->aneg = !!tb[SWITCH_LINK_FLAG_ANEG]; 
     231        link->tx_flow = !!tb[SWITCH_LINK_FLAG_TX_FLOW]; 
     232        link->rx_flow = !!tb[SWITCH_LINK_FLAG_RX_FLOW]; 
     233        link->speed = nla_get_u32(tb[SWITCH_LINK_SPEED]); 
     234        link->eee = 0; 
     235        if (tb[SWITCH_LINK_FLAG_EEE_100BASET]) 
     236                link->eee |= SWLIB_LINK_FLAG_EEE_100BASET; 
     237        if (tb[SWITCH_LINK_FLAG_EEE_1000BASET]) 
     238                link->eee |= SWLIB_LINK_FLAG_EEE_1000BASET; 
     239 
     240out: 
     241        return err; 
     242} 
     243 
     244static int 
    205245store_val(struct nl_msg *msg, void *arg) 
    206246{ 
     
    222262        else if (tb[SWITCH_ATTR_OP_VALUE_PORTS]) 
    223263                val->err = store_port_val(msg, tb[SWITCH_ATTR_OP_VALUE_PORTS], val); 
     264        else if (tb[SWITCH_ATTR_OP_VALUE_LINK]) 
     265                val->err = store_link_val(msg, tb[SWITCH_ATTR_OP_VALUE_LINK], val); 
    224266 
    225267        val->err = 0; 
  • trunk/package/network/config/swconfig/src/swlib.h

    r46232 r47998  
    106106}; 
    107107 
     108enum swlib_link_flags { 
     109        SWLIB_LINK_FLAG_EEE_100BASET = (1 << 0), 
     110        SWLIB_LINK_FLAG_EEE_1000BASET = (1 << 1), 
     111}; 
    108112 
    109113struct switch_dev; 
     
    111115struct switch_port; 
    112116struct switch_port_map; 
     117struct switch_port_link; 
    113118struct switch_val; 
    114119struct uci_package; 
     
    139144                int i; 
    140145                struct switch_port *ports; 
     146                struct switch_port_link *link; 
    141147        } value; 
    142148}; 
     
    162168}; 
    163169 
     170struct switch_port_link { 
     171        int link:1; 
     172        int duplex:1; 
     173        int aneg:1; 
     174        int tx_flow:1; 
     175        int rx_flow:1; 
     176        int speed; 
     177        /* in ethtool adv_t format */ 
     178        uint32_t eee; 
     179}; 
     180 
    164181/** 
    165182 * swlib_list: list all switches 
Note: See TracChangeset for help on using the changeset viewer.