meter.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2017 Nicira, Inc.
  4. */
  5. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  6. #include <linux/if.h>
  7. #include <linux/skbuff.h>
  8. #include <linux/ip.h>
  9. #include <linux/kernel.h>
  10. #include <linux/openvswitch.h>
  11. #include <linux/netlink.h>
  12. #include <linux/rculist.h>
  13. #include <net/netlink.h>
  14. #include <net/genetlink.h>
  15. #include "datapath.h"
  16. #include "meter.h"
  17. static const struct nla_policy meter_policy[OVS_METER_ATTR_MAX + 1] = {
  18. [OVS_METER_ATTR_ID] = { .type = NLA_U32, },
  19. [OVS_METER_ATTR_KBPS] = { .type = NLA_FLAG },
  20. [OVS_METER_ATTR_STATS] = { .len = sizeof(struct ovs_flow_stats) },
  21. [OVS_METER_ATTR_BANDS] = { .type = NLA_NESTED },
  22. [OVS_METER_ATTR_USED] = { .type = NLA_U64 },
  23. [OVS_METER_ATTR_CLEAR] = { .type = NLA_FLAG },
  24. [OVS_METER_ATTR_MAX_METERS] = { .type = NLA_U32 },
  25. [OVS_METER_ATTR_MAX_BANDS] = { .type = NLA_U32 },
  26. };
  27. static const struct nla_policy band_policy[OVS_BAND_ATTR_MAX + 1] = {
  28. [OVS_BAND_ATTR_TYPE] = { .type = NLA_U32, },
  29. [OVS_BAND_ATTR_RATE] = { .type = NLA_U32, },
  30. [OVS_BAND_ATTR_BURST] = { .type = NLA_U32, },
  31. [OVS_BAND_ATTR_STATS] = { .len = sizeof(struct ovs_flow_stats) },
  32. };
  33. static u32 meter_hash(struct dp_meter_instance *ti, u32 id)
  34. {
  35. return id % ti->n_meters;
  36. }
  37. static void ovs_meter_free(struct dp_meter *meter)
  38. {
  39. if (!meter)
  40. return;
  41. kfree_rcu(meter, rcu);
  42. }
  43. /* Call with ovs_mutex or RCU read lock. */
  44. static struct dp_meter *lookup_meter(const struct dp_meter_table *tbl,
  45. u32 meter_id)
  46. {
  47. struct dp_meter_instance *ti = rcu_dereference_ovsl(tbl->ti);
  48. u32 hash = meter_hash(ti, meter_id);
  49. struct dp_meter *meter;
  50. meter = rcu_dereference_ovsl(ti->dp_meters[hash]);
  51. if (meter && likely(meter->id == meter_id))
  52. return meter;
  53. return NULL;
  54. }
  55. static struct dp_meter_instance *dp_meter_instance_alloc(const u32 size)
  56. {
  57. struct dp_meter_instance *ti;
  58. ti = kvzalloc(struct_size(ti, dp_meters, size), GFP_KERNEL);
  59. if (!ti)
  60. return NULL;
  61. ti->n_meters = size;
  62. return ti;
  63. }
  64. static void dp_meter_instance_free(struct dp_meter_instance *ti)
  65. {
  66. kvfree(ti);
  67. }
  68. static void dp_meter_instance_free_rcu(struct rcu_head *rcu)
  69. {
  70. struct dp_meter_instance *ti;
  71. ti = container_of(rcu, struct dp_meter_instance, rcu);
  72. kvfree(ti);
  73. }
  74. static int
  75. dp_meter_instance_realloc(struct dp_meter_table *tbl, u32 size)
  76. {
  77. struct dp_meter_instance *ti = rcu_dereference_ovsl(tbl->ti);
  78. int n_meters = min(size, ti->n_meters);
  79. struct dp_meter_instance *new_ti;
  80. int i;
  81. new_ti = dp_meter_instance_alloc(size);
  82. if (!new_ti)
  83. return -ENOMEM;
  84. for (i = 0; i < n_meters; i++)
  85. if (rcu_dereference_ovsl(ti->dp_meters[i]))
  86. new_ti->dp_meters[i] = ti->dp_meters[i];
  87. rcu_assign_pointer(tbl->ti, new_ti);
  88. call_rcu(&ti->rcu, dp_meter_instance_free_rcu);
  89. return 0;
  90. }
  91. static void dp_meter_instance_insert(struct dp_meter_instance *ti,
  92. struct dp_meter *meter)
  93. {
  94. u32 hash;
  95. hash = meter_hash(ti, meter->id);
  96. rcu_assign_pointer(ti->dp_meters[hash], meter);
  97. }
  98. static void dp_meter_instance_remove(struct dp_meter_instance *ti,
  99. struct dp_meter *meter)
  100. {
  101. u32 hash;
  102. hash = meter_hash(ti, meter->id);
  103. RCU_INIT_POINTER(ti->dp_meters[hash], NULL);
  104. }
  105. static int attach_meter(struct dp_meter_table *tbl, struct dp_meter *meter)
  106. {
  107. struct dp_meter_instance *ti = rcu_dereference_ovsl(tbl->ti);
  108. u32 hash = meter_hash(ti, meter->id);
  109. int err;
  110. /* In generally, slots selected should be empty, because
  111. * OvS uses id-pool to fetch a available id.
  112. */
  113. if (unlikely(rcu_dereference_ovsl(ti->dp_meters[hash])))
  114. return -EBUSY;
  115. dp_meter_instance_insert(ti, meter);
  116. /* That function is thread-safe. */
  117. tbl->count++;
  118. if (tbl->count >= tbl->max_meters_allowed) {
  119. err = -EFBIG;
  120. goto attach_err;
  121. }
  122. if (tbl->count >= ti->n_meters &&
  123. dp_meter_instance_realloc(tbl, ti->n_meters * 2)) {
  124. err = -ENOMEM;
  125. goto attach_err;
  126. }
  127. return 0;
  128. attach_err:
  129. dp_meter_instance_remove(ti, meter);
  130. tbl->count--;
  131. return err;
  132. }
  133. static int detach_meter(struct dp_meter_table *tbl, struct dp_meter *meter)
  134. {
  135. struct dp_meter_instance *ti;
  136. ASSERT_OVSL();
  137. if (!meter)
  138. return 0;
  139. ti = rcu_dereference_ovsl(tbl->ti);
  140. dp_meter_instance_remove(ti, meter);
  141. tbl->count--;
  142. /* Shrink the meter array if necessary. */
  143. if (ti->n_meters > DP_METER_ARRAY_SIZE_MIN &&
  144. tbl->count <= (ti->n_meters / 4)) {
  145. int half_size = ti->n_meters / 2;
  146. int i;
  147. /* Avoid hash collision, don't move slots to other place.
  148. * Make sure there are no references of meters in array
  149. * which will be released.
  150. */
  151. for (i = half_size; i < ti->n_meters; i++)
  152. if (rcu_dereference_ovsl(ti->dp_meters[i]))
  153. goto out;
  154. if (dp_meter_instance_realloc(tbl, half_size))
  155. goto shrink_err;
  156. }
  157. out:
  158. return 0;
  159. shrink_err:
  160. dp_meter_instance_insert(ti, meter);
  161. tbl->count++;
  162. return -ENOMEM;
  163. }
  164. static struct sk_buff *
  165. ovs_meter_cmd_reply_start(struct genl_info *info, u8 cmd,
  166. struct ovs_header **ovs_reply_header)
  167. {
  168. struct sk_buff *skb;
  169. struct ovs_header *ovs_header = genl_info_userhdr(info);
  170. skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  171. if (!skb)
  172. return ERR_PTR(-ENOMEM);
  173. *ovs_reply_header = genlmsg_put(skb, info->snd_portid,
  174. info->snd_seq,
  175. &dp_meter_genl_family, 0, cmd);
  176. if (!*ovs_reply_header) {
  177. nlmsg_free(skb);
  178. return ERR_PTR(-EMSGSIZE);
  179. }
  180. (*ovs_reply_header)->dp_ifindex = ovs_header->dp_ifindex;
  181. return skb;
  182. }
  183. static int ovs_meter_cmd_reply_stats(struct sk_buff *reply, u32 meter_id,
  184. struct dp_meter *meter)
  185. {
  186. struct nlattr *nla;
  187. struct dp_meter_band *band;
  188. u16 i;
  189. if (nla_put_u32(reply, OVS_METER_ATTR_ID, meter_id))
  190. goto error;
  191. if (nla_put(reply, OVS_METER_ATTR_STATS,
  192. sizeof(struct ovs_flow_stats), &meter->stats))
  193. goto error;
  194. if (nla_put_u64_64bit(reply, OVS_METER_ATTR_USED, meter->used,
  195. OVS_METER_ATTR_PAD))
  196. goto error;
  197. nla = nla_nest_start_noflag(reply, OVS_METER_ATTR_BANDS);
  198. if (!nla)
  199. goto error;
  200. band = meter->bands;
  201. for (i = 0; i < meter->n_bands; ++i, ++band) {
  202. struct nlattr *band_nla;
  203. band_nla = nla_nest_start_noflag(reply, OVS_BAND_ATTR_UNSPEC);
  204. if (!band_nla || nla_put(reply, OVS_BAND_ATTR_STATS,
  205. sizeof(struct ovs_flow_stats),
  206. &band->stats))
  207. goto error;
  208. nla_nest_end(reply, band_nla);
  209. }
  210. nla_nest_end(reply, nla);
  211. return 0;
  212. error:
  213. return -EMSGSIZE;
  214. }
  215. static int ovs_meter_cmd_features(struct sk_buff *skb, struct genl_info *info)
  216. {
  217. struct ovs_header *ovs_header = genl_info_userhdr(info);
  218. struct ovs_header *ovs_reply_header;
  219. struct nlattr *nla, *band_nla;
  220. struct sk_buff *reply;
  221. struct datapath *dp;
  222. int err = -EMSGSIZE;
  223. reply = ovs_meter_cmd_reply_start(info, OVS_METER_CMD_FEATURES,
  224. &ovs_reply_header);
  225. if (IS_ERR(reply))
  226. return PTR_ERR(reply);
  227. ovs_lock();
  228. dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
  229. if (!dp) {
  230. err = -ENODEV;
  231. goto exit_unlock;
  232. }
  233. if (nla_put_u32(reply, OVS_METER_ATTR_MAX_METERS,
  234. dp->meter_tbl.max_meters_allowed))
  235. goto exit_unlock;
  236. ovs_unlock();
  237. if (nla_put_u32(reply, OVS_METER_ATTR_MAX_BANDS, DP_MAX_BANDS))
  238. goto nla_put_failure;
  239. nla = nla_nest_start_noflag(reply, OVS_METER_ATTR_BANDS);
  240. if (!nla)
  241. goto nla_put_failure;
  242. band_nla = nla_nest_start_noflag(reply, OVS_BAND_ATTR_UNSPEC);
  243. if (!band_nla)
  244. goto nla_put_failure;
  245. /* Currently only DROP band type is supported. */
  246. if (nla_put_u32(reply, OVS_BAND_ATTR_TYPE, OVS_METER_BAND_TYPE_DROP))
  247. goto nla_put_failure;
  248. nla_nest_end(reply, band_nla);
  249. nla_nest_end(reply, nla);
  250. genlmsg_end(reply, ovs_reply_header);
  251. return genlmsg_reply(reply, info);
  252. exit_unlock:
  253. ovs_unlock();
  254. nla_put_failure:
  255. nlmsg_free(reply);
  256. return err;
  257. }
  258. static struct dp_meter *dp_meter_create(struct nlattr **a)
  259. {
  260. struct nlattr *nla;
  261. int rem;
  262. u16 n_bands = 0;
  263. struct dp_meter *meter;
  264. struct dp_meter_band *band;
  265. int err;
  266. /* Validate attributes, count the bands. */
  267. if (!a[OVS_METER_ATTR_BANDS])
  268. return ERR_PTR(-EINVAL);
  269. nla_for_each_nested(nla, a[OVS_METER_ATTR_BANDS], rem)
  270. if (++n_bands > DP_MAX_BANDS)
  271. return ERR_PTR(-EINVAL);
  272. /* Allocate and set up the meter before locking anything. */
  273. meter = kzalloc(struct_size(meter, bands, n_bands), GFP_KERNEL_ACCOUNT);
  274. if (!meter)
  275. return ERR_PTR(-ENOMEM);
  276. meter->id = nla_get_u32(a[OVS_METER_ATTR_ID]);
  277. meter->used = div_u64(ktime_get_ns(), 1000 * 1000);
  278. meter->kbps = a[OVS_METER_ATTR_KBPS] ? 1 : 0;
  279. meter->keep_stats = !a[OVS_METER_ATTR_CLEAR];
  280. spin_lock_init(&meter->lock);
  281. if (meter->keep_stats && a[OVS_METER_ATTR_STATS]) {
  282. meter->stats = *(struct ovs_flow_stats *)
  283. nla_data(a[OVS_METER_ATTR_STATS]);
  284. }
  285. meter->n_bands = n_bands;
  286. /* Set up meter bands. */
  287. band = meter->bands;
  288. nla_for_each_nested(nla, a[OVS_METER_ATTR_BANDS], rem) {
  289. struct nlattr *attr[OVS_BAND_ATTR_MAX + 1];
  290. u32 band_max_delta_t;
  291. err = nla_parse_deprecated((struct nlattr **)&attr,
  292. OVS_BAND_ATTR_MAX, nla_data(nla),
  293. nla_len(nla), band_policy, NULL);
  294. if (err)
  295. goto exit_free_meter;
  296. if (!attr[OVS_BAND_ATTR_TYPE] ||
  297. !attr[OVS_BAND_ATTR_RATE] ||
  298. !attr[OVS_BAND_ATTR_BURST]) {
  299. err = -EINVAL;
  300. goto exit_free_meter;
  301. }
  302. band->type = nla_get_u32(attr[OVS_BAND_ATTR_TYPE]);
  303. band->rate = nla_get_u32(attr[OVS_BAND_ATTR_RATE]);
  304. if (band->rate == 0) {
  305. err = -EINVAL;
  306. goto exit_free_meter;
  307. }
  308. band->burst_size = nla_get_u32(attr[OVS_BAND_ATTR_BURST]);
  309. /* Figure out max delta_t that is enough to fill any bucket.
  310. * Keep max_delta_t size to the bucket units:
  311. * pkts => 1/1000 packets, kilobits => bits.
  312. *
  313. * Start with a full bucket.
  314. */
  315. band->bucket = band->burst_size * 1000ULL;
  316. band_max_delta_t = div_u64(band->bucket, band->rate);
  317. if (band_max_delta_t > meter->max_delta_t)
  318. meter->max_delta_t = band_max_delta_t;
  319. band++;
  320. }
  321. return meter;
  322. exit_free_meter:
  323. kfree(meter);
  324. return ERR_PTR(err);
  325. }
  326. static int ovs_meter_cmd_set(struct sk_buff *skb, struct genl_info *info)
  327. {
  328. struct nlattr **a = info->attrs;
  329. struct dp_meter *meter, *old_meter;
  330. struct sk_buff *reply;
  331. struct ovs_header *ovs_reply_header;
  332. struct ovs_header *ovs_header = genl_info_userhdr(info);
  333. struct dp_meter_table *meter_tbl;
  334. struct datapath *dp;
  335. int err;
  336. u32 meter_id;
  337. bool failed;
  338. if (!a[OVS_METER_ATTR_ID])
  339. return -EINVAL;
  340. meter = dp_meter_create(a);
  341. if (IS_ERR(meter))
  342. return PTR_ERR(meter);
  343. reply = ovs_meter_cmd_reply_start(info, OVS_METER_CMD_SET,
  344. &ovs_reply_header);
  345. if (IS_ERR(reply)) {
  346. err = PTR_ERR(reply);
  347. goto exit_free_meter;
  348. }
  349. ovs_lock();
  350. dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
  351. if (!dp) {
  352. err = -ENODEV;
  353. goto exit_unlock;
  354. }
  355. meter_tbl = &dp->meter_tbl;
  356. meter_id = nla_get_u32(a[OVS_METER_ATTR_ID]);
  357. old_meter = lookup_meter(meter_tbl, meter_id);
  358. err = detach_meter(meter_tbl, old_meter);
  359. if (err)
  360. goto exit_unlock;
  361. err = attach_meter(meter_tbl, meter);
  362. if (err)
  363. goto exit_free_old_meter;
  364. ovs_unlock();
  365. /* Build response with the meter_id and stats from
  366. * the old meter, if any.
  367. */
  368. failed = nla_put_u32(reply, OVS_METER_ATTR_ID, meter_id);
  369. WARN_ON(failed);
  370. if (old_meter) {
  371. spin_lock_bh(&old_meter->lock);
  372. if (old_meter->keep_stats) {
  373. err = ovs_meter_cmd_reply_stats(reply, meter_id,
  374. old_meter);
  375. WARN_ON(err);
  376. }
  377. spin_unlock_bh(&old_meter->lock);
  378. ovs_meter_free(old_meter);
  379. }
  380. genlmsg_end(reply, ovs_reply_header);
  381. return genlmsg_reply(reply, info);
  382. exit_free_old_meter:
  383. ovs_meter_free(old_meter);
  384. exit_unlock:
  385. ovs_unlock();
  386. nlmsg_free(reply);
  387. exit_free_meter:
  388. kfree(meter);
  389. return err;
  390. }
  391. static int ovs_meter_cmd_get(struct sk_buff *skb, struct genl_info *info)
  392. {
  393. struct ovs_header *ovs_header = genl_info_userhdr(info);
  394. struct ovs_header *ovs_reply_header;
  395. struct nlattr **a = info->attrs;
  396. struct dp_meter *meter;
  397. struct sk_buff *reply;
  398. struct datapath *dp;
  399. u32 meter_id;
  400. int err;
  401. if (!a[OVS_METER_ATTR_ID])
  402. return -EINVAL;
  403. meter_id = nla_get_u32(a[OVS_METER_ATTR_ID]);
  404. reply = ovs_meter_cmd_reply_start(info, OVS_METER_CMD_GET,
  405. &ovs_reply_header);
  406. if (IS_ERR(reply))
  407. return PTR_ERR(reply);
  408. ovs_lock();
  409. dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
  410. if (!dp) {
  411. err = -ENODEV;
  412. goto exit_unlock;
  413. }
  414. /* Locate meter, copy stats. */
  415. meter = lookup_meter(&dp->meter_tbl, meter_id);
  416. if (!meter) {
  417. err = -ENOENT;
  418. goto exit_unlock;
  419. }
  420. spin_lock_bh(&meter->lock);
  421. err = ovs_meter_cmd_reply_stats(reply, meter_id, meter);
  422. spin_unlock_bh(&meter->lock);
  423. if (err)
  424. goto exit_unlock;
  425. ovs_unlock();
  426. genlmsg_end(reply, ovs_reply_header);
  427. return genlmsg_reply(reply, info);
  428. exit_unlock:
  429. ovs_unlock();
  430. nlmsg_free(reply);
  431. return err;
  432. }
  433. static int ovs_meter_cmd_del(struct sk_buff *skb, struct genl_info *info)
  434. {
  435. struct ovs_header *ovs_header = genl_info_userhdr(info);
  436. struct ovs_header *ovs_reply_header;
  437. struct nlattr **a = info->attrs;
  438. struct dp_meter *old_meter;
  439. struct sk_buff *reply;
  440. struct datapath *dp;
  441. u32 meter_id;
  442. int err;
  443. if (!a[OVS_METER_ATTR_ID])
  444. return -EINVAL;
  445. reply = ovs_meter_cmd_reply_start(info, OVS_METER_CMD_DEL,
  446. &ovs_reply_header);
  447. if (IS_ERR(reply))
  448. return PTR_ERR(reply);
  449. ovs_lock();
  450. dp = get_dp(sock_net(skb->sk), ovs_header->dp_ifindex);
  451. if (!dp) {
  452. err = -ENODEV;
  453. goto exit_unlock;
  454. }
  455. meter_id = nla_get_u32(a[OVS_METER_ATTR_ID]);
  456. old_meter = lookup_meter(&dp->meter_tbl, meter_id);
  457. if (old_meter) {
  458. spin_lock_bh(&old_meter->lock);
  459. err = ovs_meter_cmd_reply_stats(reply, meter_id, old_meter);
  460. WARN_ON(err);
  461. spin_unlock_bh(&old_meter->lock);
  462. err = detach_meter(&dp->meter_tbl, old_meter);
  463. if (err)
  464. goto exit_unlock;
  465. }
  466. ovs_unlock();
  467. ovs_meter_free(old_meter);
  468. genlmsg_end(reply, ovs_reply_header);
  469. return genlmsg_reply(reply, info);
  470. exit_unlock:
  471. ovs_unlock();
  472. nlmsg_free(reply);
  473. return err;
  474. }
  475. /* Meter action execution.
  476. *
  477. * Return true 'meter_id' drop band is triggered. The 'skb' should be
  478. * dropped by the caller'.
  479. */
  480. bool ovs_meter_execute(struct datapath *dp, struct sk_buff *skb,
  481. struct sw_flow_key *key, u32 meter_id)
  482. {
  483. long long int now_ms = div_u64(ktime_get_ns(), 1000 * 1000);
  484. long long int long_delta_ms;
  485. struct dp_meter_band *band;
  486. struct dp_meter *meter;
  487. int i, band_exceeded_max = -1;
  488. u32 band_exceeded_rate = 0;
  489. u32 delta_ms;
  490. u32 cost;
  491. meter = lookup_meter(&dp->meter_tbl, meter_id);
  492. /* Do not drop the packet when there is no meter. */
  493. if (!meter)
  494. return false;
  495. /* Lock the meter while using it. */
  496. spin_lock(&meter->lock);
  497. long_delta_ms = (now_ms - meter->used); /* ms */
  498. if (long_delta_ms < 0) {
  499. /* This condition means that we have several threads fighting
  500. * for a meter lock, and the one who received the packets a
  501. * bit later wins. Assuming that all racing threads received
  502. * packets at the same time to avoid overflow.
  503. */
  504. long_delta_ms = 0;
  505. }
  506. /* Make sure delta_ms will not be too large, so that bucket will not
  507. * wrap around below.
  508. */
  509. delta_ms = (long_delta_ms > (long long int)meter->max_delta_t)
  510. ? meter->max_delta_t : (u32)long_delta_ms;
  511. /* Update meter statistics.
  512. */
  513. meter->used = now_ms;
  514. meter->stats.n_packets += 1;
  515. meter->stats.n_bytes += skb->len;
  516. /* Bucket rate is either in kilobits per second, or in packets per
  517. * second. We maintain the bucket in the units of either bits or
  518. * 1/1000th of a packet, correspondingly.
  519. * Then, when rate is multiplied with milliseconds, we get the
  520. * bucket units:
  521. * msec * kbps = bits, and
  522. * msec * packets/sec = 1/1000 packets.
  523. *
  524. * 'cost' is the number of bucket units in this packet.
  525. */
  526. cost = (meter->kbps) ? skb->len * 8 : 1000;
  527. /* Update all bands and find the one hit with the highest rate. */
  528. for (i = 0; i < meter->n_bands; ++i) {
  529. long long int max_bucket_size;
  530. band = &meter->bands[i];
  531. max_bucket_size = band->burst_size * 1000LL;
  532. band->bucket += delta_ms * band->rate;
  533. if (band->bucket > max_bucket_size)
  534. band->bucket = max_bucket_size;
  535. if (band->bucket >= cost) {
  536. band->bucket -= cost;
  537. } else if (band->rate > band_exceeded_rate) {
  538. band_exceeded_rate = band->rate;
  539. band_exceeded_max = i;
  540. }
  541. }
  542. if (band_exceeded_max >= 0) {
  543. /* Update band statistics. */
  544. band = &meter->bands[band_exceeded_max];
  545. band->stats.n_packets += 1;
  546. band->stats.n_bytes += skb->len;
  547. /* Drop band triggered, let the caller drop the 'skb'. */
  548. if (band->type == OVS_METER_BAND_TYPE_DROP) {
  549. spin_unlock(&meter->lock);
  550. return true;
  551. }
  552. }
  553. spin_unlock(&meter->lock);
  554. return false;
  555. }
  556. static const struct genl_small_ops dp_meter_genl_ops[] = {
  557. { .cmd = OVS_METER_CMD_FEATURES,
  558. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  559. .flags = 0, /* OK for unprivileged users. */
  560. .doit = ovs_meter_cmd_features
  561. },
  562. { .cmd = OVS_METER_CMD_SET,
  563. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  564. .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN
  565. * privilege.
  566. */
  567. .doit = ovs_meter_cmd_set,
  568. },
  569. { .cmd = OVS_METER_CMD_GET,
  570. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  571. .flags = 0, /* OK for unprivileged users. */
  572. .doit = ovs_meter_cmd_get,
  573. },
  574. { .cmd = OVS_METER_CMD_DEL,
  575. .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
  576. .flags = GENL_UNS_ADMIN_PERM, /* Requires CAP_NET_ADMIN
  577. * privilege.
  578. */
  579. .doit = ovs_meter_cmd_del
  580. },
  581. };
  582. static const struct genl_multicast_group ovs_meter_multicast_group = {
  583. .name = OVS_METER_MCGROUP,
  584. };
  585. struct genl_family dp_meter_genl_family __ro_after_init = {
  586. .hdrsize = sizeof(struct ovs_header),
  587. .name = OVS_METER_FAMILY,
  588. .version = OVS_METER_VERSION,
  589. .maxattr = OVS_METER_ATTR_MAX,
  590. .policy = meter_policy,
  591. .netnsok = true,
  592. .parallel_ops = true,
  593. .small_ops = dp_meter_genl_ops,
  594. .n_small_ops = ARRAY_SIZE(dp_meter_genl_ops),
  595. .resv_start_op = OVS_METER_CMD_GET + 1,
  596. .mcgrps = &ovs_meter_multicast_group,
  597. .n_mcgrps = 1,
  598. .module = THIS_MODULE,
  599. };
  600. int ovs_meters_init(struct datapath *dp)
  601. {
  602. struct dp_meter_table *tbl = &dp->meter_tbl;
  603. struct dp_meter_instance *ti;
  604. unsigned long free_mem_bytes;
  605. ti = dp_meter_instance_alloc(DP_METER_ARRAY_SIZE_MIN);
  606. if (!ti)
  607. return -ENOMEM;
  608. /* Allow meters in a datapath to use ~3.12% of physical memory. */
  609. free_mem_bytes = nr_free_buffer_pages() * (PAGE_SIZE >> 5);
  610. tbl->max_meters_allowed = min(free_mem_bytes / sizeof(struct dp_meter),
  611. DP_METER_NUM_MAX);
  612. if (!tbl->max_meters_allowed)
  613. goto out_err;
  614. rcu_assign_pointer(tbl->ti, ti);
  615. tbl->count = 0;
  616. return 0;
  617. out_err:
  618. dp_meter_instance_free(ti);
  619. return -ENOMEM;
  620. }
  621. void ovs_meters_exit(struct datapath *dp)
  622. {
  623. struct dp_meter_table *tbl = &dp->meter_tbl;
  624. struct dp_meter_instance *ti = rcu_dereference_raw(tbl->ti);
  625. int i;
  626. for (i = 0; i < ti->n_meters; i++)
  627. ovs_meter_free(rcu_dereference_raw(ti->dp_meters[i]));
  628. dp_meter_instance_free(ti);
  629. }