Changeset 47997


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

swconfig: add SWITCH_TYPE_LINK and support sending link info to user space

So far we were sending link data as a string. It got some drawbacks:
1) Didn't allow writing clean user space apps reading link state. It was

needed to do some screen scraping.

2) Forced whole PORT_LINK communication to be string based. Adding

support for *setting* port link required passing string and parting
it in the kernel space.

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

Location:
trunk/target/linux/generic/files
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic/files/drivers/net/phy/swconfig.c

    r44617 r47997  
    772772 
    773773static int 
     774swconfig_send_link(struct sk_buff *msg, struct genl_info *info, int attr, 
     775                   const struct switch_port_link *link) 
     776{ 
     777        struct nlattr *p = NULL; 
     778        int err = 0; 
     779 
     780        p = nla_nest_start(msg, attr); 
     781        if (link->link) { 
     782                if (nla_put_flag(msg, SWITCH_LINK_FLAG_LINK)) 
     783                        goto nla_put_failure; 
     784        } 
     785        if (link->duplex) { 
     786                if (nla_put_flag(msg, SWITCH_LINK_FLAG_DUPLEX)) 
     787                        goto nla_put_failure; 
     788        } 
     789        if (link->aneg) { 
     790                if (nla_put_flag(msg, SWITCH_LINK_FLAG_ANEG)) 
     791                        goto nla_put_failure; 
     792        } 
     793        if (link->tx_flow) { 
     794                if (nla_put_flag(msg, SWITCH_LINK_FLAG_TX_FLOW)) 
     795                        goto nla_put_failure; 
     796        } 
     797        if (link->rx_flow) { 
     798                if (nla_put_flag(msg, SWITCH_LINK_FLAG_RX_FLOW)) 
     799                        goto nla_put_failure; 
     800        } 
     801        if (nla_put_u32(msg, SWITCH_LINK_SPEED, link->speed)) 
     802                goto nla_put_failure; 
     803        if (link->eee & ADVERTISED_100baseT_Full) { 
     804                if (nla_put_flag(msg, SWITCH_LINK_FLAG_EEE_100BASET)) 
     805                        goto nla_put_failure; 
     806        } 
     807        if (link->eee & ADVERTISED_1000baseT_Full) { 
     808                if (nla_put_flag(msg, SWITCH_LINK_FLAG_EEE_1000BASET)) 
     809                        goto nla_put_failure; 
     810        } 
     811        nla_nest_end(msg, p); 
     812 
     813        return err; 
     814 
     815nla_put_failure: 
     816        nla_nest_cancel(msg, p); 
     817        return -1; 
     818} 
     819 
     820static int 
    774821swconfig_get_attr(struct sk_buff *skb, struct genl_info *info) 
    775822{ 
     
    795842                memset(dev->portbuf, 0, 
    796843                        sizeof(struct switch_port) * dev->ports); 
     844        } else if (attr->type == SWITCH_TYPE_LINK) { 
     845                val.value.link = &dev->linkbuf; 
     846                memset(&dev->linkbuf, 0, sizeof(struct switch_port_link)); 
    797847        } 
    798848 
     
    822872                err = swconfig_send_ports(&msg, info, 
    823873                                SWITCH_ATTR_OP_VALUE_PORTS, &val); 
     874                if (err < 0) 
     875                        goto nla_put_failure; 
     876                break; 
     877        case SWITCH_TYPE_LINK: 
     878                err = swconfig_send_link(msg, info, 
     879                                         SWITCH_ATTR_OP_VALUE_LINK, val.value.link); 
    824880                if (err < 0) 
    825881                        goto nla_put_failure; 
  • trunk/target/linux/generic/files/include/linux/switch.h

    r44022 r47997  
    123123        struct switch_port *portbuf; 
    124124        struct switch_portmap *portmap; 
     125        struct switch_port_link linkbuf; 
    125126 
    126127        char buf[128]; 
     
    149150                u32 i; 
    150151                struct switch_port *ports; 
     152                struct switch_port_link *link; 
    151153        } value; 
    152154}; 
  • trunk/target/linux/generic/files/include/uapi/linux/switch.h

    r36283 r47997  
    5151        SWITCH_ATTR_OP_VALUE_STR, 
    5252        SWITCH_ATTR_OP_VALUE_PORTS, 
     53        SWITCH_ATTR_OP_VALUE_LINK, 
    5354        SWITCH_ATTR_OP_DESCRIPTION, 
    5455        /* port lists */ 
     
    8788        SWITCH_TYPE_STRING, 
    8889        SWITCH_TYPE_PORTS, 
     90        SWITCH_TYPE_LINK, 
    8991        SWITCH_TYPE_NOVAL, 
    9092}; 
     
    98100}; 
    99101 
     102/* link nested attributes */ 
     103enum { 
     104        SWITCH_LINK_UNSPEC, 
     105        SWITCH_LINK_FLAG_LINK, 
     106        SWITCH_LINK_FLAG_DUPLEX, 
     107        SWITCH_LINK_FLAG_ANEG, 
     108        SWITCH_LINK_FLAG_TX_FLOW, 
     109        SWITCH_LINK_FLAG_RX_FLOW, 
     110        SWITCH_LINK_SPEED, 
     111        SWITCH_LINK_FLAG_EEE_100BASET, 
     112        SWITCH_LINK_FLAG_EEE_1000BASET, 
     113        SWITCH_LINK_ATTR_MAX, 
     114}; 
     115 
    100116#define SWITCH_ATTR_DEFAULTS_OFFSET     0x1000 
    101117 
Note: See TracChangeset for help on using the changeset viewer.