~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/ethtool/pause.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /net/ethtool/pause.c (Version linux-6.12-rc7) and /net/ethtool/pause.c (Version linux-6.0.19)


  1 // SPDX-License-Identifier: GPL-2.0-only            1 // SPDX-License-Identifier: GPL-2.0-only
  2                                                     2 
  3 #include "netlink.h"                                3 #include "netlink.h"
  4 #include "common.h"                                 4 #include "common.h"
  5                                                     5 
  6 struct pause_req_info {                             6 struct pause_req_info {
  7         struct ethnl_req_info           base;       7         struct ethnl_req_info           base;
  8         enum ethtool_mac_stats_src      src;   << 
  9 };                                                  8 };
 10                                                     9 
 11 #define PAUSE_REQINFO(__req_base) \            << 
 12         container_of(__req_base, struct pause_ << 
 13                                                << 
 14 struct pause_reply_data {                          10 struct pause_reply_data {
 15         struct ethnl_reply_data         base;      11         struct ethnl_reply_data         base;
 16         struct ethtool_pauseparam       pausep     12         struct ethtool_pauseparam       pauseparam;
 17         struct ethtool_pause_stats      pauses     13         struct ethtool_pause_stats      pausestat;
 18 };                                                 14 };
 19                                                    15 
 20 #define PAUSE_REPDATA(__reply_base) \              16 #define PAUSE_REPDATA(__reply_base) \
 21         container_of(__reply_base, struct paus     17         container_of(__reply_base, struct pause_reply_data, base)
 22                                                    18 
 23 const struct nla_policy ethnl_pause_get_policy     19 const struct nla_policy ethnl_pause_get_policy[] = {
 24         [ETHTOOL_A_PAUSE_HEADER]                   20         [ETHTOOL_A_PAUSE_HEADER]                =
 25                 NLA_POLICY_NESTED(ethnl_header     21                 NLA_POLICY_NESTED(ethnl_header_policy_stats),
 26         [ETHTOOL_A_PAUSE_STATS_SRC]            << 
 27                 NLA_POLICY_MAX(NLA_U32, ETHTOO << 
 28 };                                                 22 };
 29                                                    23 
 30 static int pause_parse_request(struct ethnl_re << 
 31                                struct nlattr * << 
 32                                struct netlink_ << 
 33 {                                              << 
 34         enum ethtool_mac_stats_src src = ETHTO << 
 35         struct pause_req_info *req_info = PAUS << 
 36                                                << 
 37         if (tb[ETHTOOL_A_PAUSE_STATS_SRC]) {   << 
 38                 if (!(req_base->flags & ETHTOO << 
 39                         NL_SET_ERR_MSG_MOD(ext << 
 40                                            "ET << 
 41                         return -EINVAL;        << 
 42                 }                              << 
 43                                                << 
 44                 src = nla_get_u32(tb[ETHTOOL_A << 
 45         }                                      << 
 46                                                << 
 47         req_info->src = src;                   << 
 48                                                << 
 49         return 0;                              << 
 50 }                                              << 
 51                                                << 
 52 static int pause_prepare_data(const struct eth     24 static int pause_prepare_data(const struct ethnl_req_info *req_base,
 53                               struct ethnl_rep     25                               struct ethnl_reply_data *reply_base,
 54                               const struct gen !!  26                               struct genl_info *info)
 55 {                                                  27 {
 56         const struct pause_req_info *req_info  << 
 57         struct pause_reply_data *data = PAUSE_     28         struct pause_reply_data *data = PAUSE_REPDATA(reply_base);
 58         enum ethtool_mac_stats_src src = req_i << 
 59         struct net_device *dev = reply_base->d     29         struct net_device *dev = reply_base->dev;
 60         int ret;                                   30         int ret;
 61                                                    31 
 62         if (!dev->ethtool_ops->get_pauseparam)     32         if (!dev->ethtool_ops->get_pauseparam)
 63                 return -EOPNOTSUPP;                33                 return -EOPNOTSUPP;
 64                                                    34 
 65         ethtool_stats_init((u64 *)&data->pause     35         ethtool_stats_init((u64 *)&data->pausestat,
 66                            sizeof(data->pauses     36                            sizeof(data->pausestat) / 8);
 67         data->pausestat.src = src;             << 
 68                                                    37 
 69         ret = ethnl_ops_begin(dev);                38         ret = ethnl_ops_begin(dev);
 70         if (ret < 0)                               39         if (ret < 0)
 71                 return ret;                        40                 return ret;
 72                                                << 
 73         if ((src == ETHTOOL_MAC_STATS_SRC_EMAC << 
 74              src == ETHTOOL_MAC_STATS_SRC_PMAC << 
 75             !__ethtool_dev_mm_supported(dev))  << 
 76                 NL_SET_ERR_MSG_MOD(info->extac << 
 77                                    "Device doe << 
 78                 ethnl_ops_complete(dev);       << 
 79                 return -EOPNOTSUPP;            << 
 80         }                                      << 
 81                                                << 
 82         dev->ethtool_ops->get_pauseparam(dev,      41         dev->ethtool_ops->get_pauseparam(dev, &data->pauseparam);
 83         if (req_base->flags & ETHTOOL_FLAG_STA     42         if (req_base->flags & ETHTOOL_FLAG_STATS &&
 84             dev->ethtool_ops->get_pause_stats)     43             dev->ethtool_ops->get_pause_stats)
 85                 dev->ethtool_ops->get_pause_st     44                 dev->ethtool_ops->get_pause_stats(dev, &data->pausestat);
 86                                                << 
 87         ethnl_ops_complete(dev);                   45         ethnl_ops_complete(dev);
 88                                                    46 
 89         return 0;                                  47         return 0;
 90 }                                                  48 }
 91                                                    49 
 92 static int pause_reply_size(const struct ethnl     50 static int pause_reply_size(const struct ethnl_req_info *req_base,
 93                             const struct ethnl     51                             const struct ethnl_reply_data *reply_base)
 94 {                                                  52 {
 95         int n = nla_total_size(sizeof(u8)) +       53         int n = nla_total_size(sizeof(u8)) +    /* _PAUSE_AUTONEG */
 96                 nla_total_size(sizeof(u8)) +       54                 nla_total_size(sizeof(u8)) +    /* _PAUSE_RX */
 97                 nla_total_size(sizeof(u8));        55                 nla_total_size(sizeof(u8));     /* _PAUSE_TX */
 98                                                    56 
 99         if (req_base->flags & ETHTOOL_FLAG_STA     57         if (req_base->flags & ETHTOOL_FLAG_STATS)
100                 n += nla_total_size(0) +           58                 n += nla_total_size(0) +        /* _PAUSE_STATS */
101                      nla_total_size(sizeof(u32 << 
102                      nla_total_size_64bit(size     59                      nla_total_size_64bit(sizeof(u64)) * ETHTOOL_PAUSE_STAT_CNT;
103         return n;                                  60         return n;
104 }                                                  61 }
105                                                    62 
106 static int ethtool_put_stat(struct sk_buff *sk     63 static int ethtool_put_stat(struct sk_buff *skb, u64 val, u16 attrtype,
107                             u16 padtype)           64                             u16 padtype)
108 {                                                  65 {
109         if (val == ETHTOOL_STAT_NOT_SET)           66         if (val == ETHTOOL_STAT_NOT_SET)
110                 return 0;                          67                 return 0;
111         if (nla_put_u64_64bit(skb, attrtype, v     68         if (nla_put_u64_64bit(skb, attrtype, val, padtype))
112                 return -EMSGSIZE;                  69                 return -EMSGSIZE;
113                                                    70 
114         return 0;                                  71         return 0;
115 }                                                  72 }
116                                                    73 
117 static int pause_put_stats(struct sk_buff *skb     74 static int pause_put_stats(struct sk_buff *skb,
118                            const struct ethtoo     75                            const struct ethtool_pause_stats *pause_stats)
119 {                                                  76 {
120         const u16 pad = ETHTOOL_A_PAUSE_STAT_P     77         const u16 pad = ETHTOOL_A_PAUSE_STAT_PAD;
121         struct nlattr *nest;                       78         struct nlattr *nest;
122                                                    79 
123         if (nla_put_u32(skb, ETHTOOL_A_PAUSE_S << 
124                 return -EMSGSIZE;              << 
125                                                << 
126         nest = nla_nest_start(skb, ETHTOOL_A_P     80         nest = nla_nest_start(skb, ETHTOOL_A_PAUSE_STATS);
127         if (!nest)                                 81         if (!nest)
128                 return -EMSGSIZE;                  82                 return -EMSGSIZE;
129                                                    83 
130         if (ethtool_put_stat(skb, pause_stats-     84         if (ethtool_put_stat(skb, pause_stats->tx_pause_frames,
131                              ETHTOOL_A_PAUSE_S     85                              ETHTOOL_A_PAUSE_STAT_TX_FRAMES, pad) ||
132             ethtool_put_stat(skb, pause_stats-     86             ethtool_put_stat(skb, pause_stats->rx_pause_frames,
133                              ETHTOOL_A_PAUSE_S     87                              ETHTOOL_A_PAUSE_STAT_RX_FRAMES, pad))
134                 goto err_cancel;                   88                 goto err_cancel;
135                                                    89 
136         nla_nest_end(skb, nest);                   90         nla_nest_end(skb, nest);
137         return 0;                                  91         return 0;
138                                                    92 
139 err_cancel:                                        93 err_cancel:
140         nla_nest_cancel(skb, nest);                94         nla_nest_cancel(skb, nest);
141         return -EMSGSIZE;                          95         return -EMSGSIZE;
142 }                                                  96 }
143                                                    97 
144 static int pause_fill_reply(struct sk_buff *sk     98 static int pause_fill_reply(struct sk_buff *skb,
145                             const struct ethnl     99                             const struct ethnl_req_info *req_base,
146                             const struct ethnl    100                             const struct ethnl_reply_data *reply_base)
147 {                                                 101 {
148         const struct pause_reply_data *data =     102         const struct pause_reply_data *data = PAUSE_REPDATA(reply_base);
149         const struct ethtool_pauseparam *pause    103         const struct ethtool_pauseparam *pauseparam = &data->pauseparam;
150                                                   104 
151         if (nla_put_u8(skb, ETHTOOL_A_PAUSE_AU    105         if (nla_put_u8(skb, ETHTOOL_A_PAUSE_AUTONEG, !!pauseparam->autoneg) ||
152             nla_put_u8(skb, ETHTOOL_A_PAUSE_RX    106             nla_put_u8(skb, ETHTOOL_A_PAUSE_RX, !!pauseparam->rx_pause) ||
153             nla_put_u8(skb, ETHTOOL_A_PAUSE_TX    107             nla_put_u8(skb, ETHTOOL_A_PAUSE_TX, !!pauseparam->tx_pause))
154                 return -EMSGSIZE;                 108                 return -EMSGSIZE;
155                                                   109 
156         if (req_base->flags & ETHTOOL_FLAG_STA    110         if (req_base->flags & ETHTOOL_FLAG_STATS &&
157             pause_put_stats(skb, &data->pauses    111             pause_put_stats(skb, &data->pausestat))
158                 return -EMSGSIZE;                 112                 return -EMSGSIZE;
159                                                   113 
160         return 0;                                 114         return 0;
161 }                                                 115 }
162                                                   116 
                                                   >> 117 const struct ethnl_request_ops ethnl_pause_request_ops = {
                                                   >> 118         .request_cmd            = ETHTOOL_MSG_PAUSE_GET,
                                                   >> 119         .reply_cmd              = ETHTOOL_MSG_PAUSE_GET_REPLY,
                                                   >> 120         .hdr_attr               = ETHTOOL_A_PAUSE_HEADER,
                                                   >> 121         .req_info_size          = sizeof(struct pause_req_info),
                                                   >> 122         .reply_data_size        = sizeof(struct pause_reply_data),
                                                   >> 123 
                                                   >> 124         .prepare_data           = pause_prepare_data,
                                                   >> 125         .reply_size             = pause_reply_size,
                                                   >> 126         .fill_reply             = pause_fill_reply,
                                                   >> 127 };
                                                   >> 128 
163 /* PAUSE_SET */                                   129 /* PAUSE_SET */
164                                                   130 
165 const struct nla_policy ethnl_pause_set_policy    131 const struct nla_policy ethnl_pause_set_policy[] = {
166         [ETHTOOL_A_PAUSE_HEADER]                  132         [ETHTOOL_A_PAUSE_HEADER]                =
167                 NLA_POLICY_NESTED(ethnl_header    133                 NLA_POLICY_NESTED(ethnl_header_policy),
168         [ETHTOOL_A_PAUSE_AUTONEG]                 134         [ETHTOOL_A_PAUSE_AUTONEG]               = { .type = NLA_U8 },
169         [ETHTOOL_A_PAUSE_RX]                      135         [ETHTOOL_A_PAUSE_RX]                    = { .type = NLA_U8 },
170         [ETHTOOL_A_PAUSE_TX]                      136         [ETHTOOL_A_PAUSE_TX]                    = { .type = NLA_U8 },
171 };                                                137 };
172                                                   138 
173 static int                                     !! 139 int ethnl_set_pause(struct sk_buff *skb, struct genl_info *info)
174 ethnl_set_pause_validate(struct ethnl_req_info << 
175                          struct genl_info *inf << 
176 {                                                 140 {
177         const struct ethtool_ops *ops = req_in << 
178                                                << 
179         return ops->get_pauseparam && ops->set << 
180 }                                              << 
181                                                << 
182 static int                                     << 
183 ethnl_set_pause(struct ethnl_req_info *req_inf << 
184 {                                              << 
185         struct net_device *dev = req_info->dev << 
186         struct ethtool_pauseparam params = {};    141         struct ethtool_pauseparam params = {};
                                                   >> 142         struct ethnl_req_info req_info = {};
187         struct nlattr **tb = info->attrs;         143         struct nlattr **tb = info->attrs;
                                                   >> 144         const struct ethtool_ops *ops;
                                                   >> 145         struct net_device *dev;
188         bool mod = false;                         146         bool mod = false;
189         int ret;                                  147         int ret;
190                                                   148 
191         dev->ethtool_ops->get_pauseparam(dev,  !! 149         ret = ethnl_parse_header_dev_get(&req_info,
                                                   >> 150                                          tb[ETHTOOL_A_PAUSE_HEADER],
                                                   >> 151                                          genl_info_net(info), info->extack,
                                                   >> 152                                          true);
                                                   >> 153         if (ret < 0)
                                                   >> 154                 return ret;
                                                   >> 155         dev = req_info.dev;
                                                   >> 156         ops = dev->ethtool_ops;
                                                   >> 157         ret = -EOPNOTSUPP;
                                                   >> 158         if (!ops->get_pauseparam || !ops->set_pauseparam)
                                                   >> 159                 goto out_dev;
                                                   >> 160 
                                                   >> 161         rtnl_lock();
                                                   >> 162         ret = ethnl_ops_begin(dev);
                                                   >> 163         if (ret < 0)
                                                   >> 164                 goto out_rtnl;
                                                   >> 165         ops->get_pauseparam(dev, &params);
192                                                   166 
193         ethnl_update_bool32(&params.autoneg, t    167         ethnl_update_bool32(&params.autoneg, tb[ETHTOOL_A_PAUSE_AUTONEG], &mod);
194         ethnl_update_bool32(&params.rx_pause,     168         ethnl_update_bool32(&params.rx_pause, tb[ETHTOOL_A_PAUSE_RX], &mod);
195         ethnl_update_bool32(&params.tx_pause,     169         ethnl_update_bool32(&params.tx_pause, tb[ETHTOOL_A_PAUSE_TX], &mod);
                                                   >> 170         ret = 0;
196         if (!mod)                                 171         if (!mod)
197                 return 0;                      !! 172                 goto out_ops;
198                                                   173 
199         ret = dev->ethtool_ops->set_pauseparam    174         ret = dev->ethtool_ops->set_pauseparam(dev, &params);
200         return ret < 0 ? ret : 1;              !! 175         if (ret < 0)
201 }                                              !! 176                 goto out_ops;
202                                                !! 177         ethtool_notify(dev, ETHTOOL_MSG_PAUSE_NTF, NULL);
203 const struct ethnl_request_ops ethnl_pause_req << 
204         .request_cmd            = ETHTOOL_MSG_ << 
205         .reply_cmd              = ETHTOOL_MSG_ << 
206         .hdr_attr               = ETHTOOL_A_PA << 
207         .req_info_size          = sizeof(struc << 
208         .reply_data_size        = sizeof(struc << 
209                                                << 
210         .parse_request          = pause_parse_ << 
211         .prepare_data           = pause_prepar << 
212         .reply_size             = pause_reply_ << 
213         .fill_reply             = pause_fill_r << 
214                                                   178 
215         .set_validate           = ethnl_set_pa !! 179 out_ops:
216         .set                    = ethnl_set_pa !! 180         ethnl_ops_complete(dev);
217         .set_ntf_cmd            = ETHTOOL_MSG_ !! 181 out_rtnl:
218 };                                             !! 182         rtnl_unlock();
                                                   >> 183 out_dev:
                                                   >> 184         ethnl_parse_header_dev_put(&req_info);
                                                   >> 185         return ret;
                                                   >> 186 }
219                                                   187 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php