1 // SPDX-License-Identifier: GPL-2.0+ 2 /* Microchip VCAP API 3 * 4 * Copyright (c) 2022 Microchip Technology Inc. and its subsidiaries. 5 */ 6 7 #include <linux/types.h> 8 9 #include "vcap_api_private.h" 10 11 static int keyfield_size_table[] = { 12 [VCAP_FIELD_BIT] = sizeof(struct vcap_u1_key), 13 [VCAP_FIELD_U32] = sizeof(struct vcap_u32_key), 14 [VCAP_FIELD_U48] = sizeof(struct vcap_u48_key), 15 [VCAP_FIELD_U56] = sizeof(struct vcap_u56_key), 16 [VCAP_FIELD_U64] = sizeof(struct vcap_u64_key), 17 [VCAP_FIELD_U72] = sizeof(struct vcap_u72_key), 18 [VCAP_FIELD_U112] = sizeof(struct vcap_u112_key), 19 [VCAP_FIELD_U128] = sizeof(struct vcap_u128_key), 20 }; 21 22 static int actionfield_size_table[] = { 23 [VCAP_FIELD_BIT] = sizeof(struct vcap_u1_action), 24 [VCAP_FIELD_U32] = sizeof(struct vcap_u32_action), 25 [VCAP_FIELD_U48] = sizeof(struct vcap_u48_action), 26 [VCAP_FIELD_U56] = sizeof(struct vcap_u56_action), 27 [VCAP_FIELD_U64] = sizeof(struct vcap_u64_action), 28 [VCAP_FIELD_U72] = sizeof(struct vcap_u72_action), 29 [VCAP_FIELD_U112] = sizeof(struct vcap_u112_action), 30 [VCAP_FIELD_U128] = sizeof(struct vcap_u128_action), 31 }; 32 33 /* Moving a rule in the VCAP address space */ 34 struct vcap_rule_move { 35 int addr; /* address to move */ 36 int offset; /* change in address */ 37 int count; /* blocksize of addresses to move */ 38 }; 39 40 /* Stores the filter cookie and chain id that enabled the port */ 41 struct vcap_enabled_port { 42 struct list_head list; /* for insertion in enabled ports list */ 43 struct net_device *ndev; /* the enabled port */ 44 unsigned long cookie; /* filter that enabled the port */ 45 int src_cid; /* source chain id */ 46 int dst_cid; /* destination chain id */ 47 }; 48 49 void vcap_iter_set(struct vcap_stream_iter *itr, int sw_width, 50 const struct vcap_typegroup *tg, u32 offset) 51 { 52 memset(itr, 0, sizeof(*itr)); 53 itr->offset = offset; 54 itr->sw_width = sw_width; 55 itr->regs_per_sw = DIV_ROUND_UP(sw_width, 32); 56 itr->tg = tg; 57 } 58 59 static void vcap_iter_skip_tg(struct vcap_stream_iter *itr) 60 { 61 /* Compensate the field offset for preceding typegroups. 62 * A typegroup table ends with an all-zero terminator. 63 */ 64 while (itr->tg->width && itr->offset >= itr->tg->offset) { 65 itr->offset += itr->tg->width; 66 itr->tg++; /* next typegroup */ 67 } 68 } 69 70 void vcap_iter_update(struct vcap_stream_iter *itr) 71 { 72 int sw_idx, sw_bitpos; 73 74 /* Calculate the subword index and bitposition for current bit */ 75 sw_idx = itr->offset / itr->sw_width; 76 sw_bitpos = itr->offset % itr->sw_width; 77 /* Calculate the register index and bitposition for current bit */ 78 itr->reg_idx = (sw_idx * itr->regs_per_sw) + (sw_bitpos / 32); 79 itr->reg_bitpos = sw_bitpos % 32; 80 } 81 82 void vcap_iter_init(struct vcap_stream_iter *itr, int sw_width, 83 const struct vcap_typegroup *tg, u32 offset) 84 { 85 vcap_iter_set(itr, sw_width, tg, offset); 86 vcap_iter_skip_tg(itr); 87 vcap_iter_update(itr); 88 } 89 90 void vcap_iter_next(struct vcap_stream_iter *itr) 91 { 92 itr->offset++; 93 vcap_iter_skip_tg(itr); 94 vcap_iter_update(itr); 95 } 96 97 static void vcap_set_bit(u32 *stream, struct vcap_stream_iter *itr, bool value) 98 { 99 u32 mask = BIT(itr->reg_bitpos); 100 u32 *p = &stream[itr->reg_idx]; 101 102 if (value) 103 *p |= mask; 104 else 105 *p &= ~mask; 106 } 107 108 static void vcap_encode_bit(u32 *stream, struct vcap_stream_iter *itr, bool val) 109 { 110 /* When intersected by a type group field, stream the type group bits 111 * before continuing with the value bit 112 */ 113 while (itr->tg->width && 114 itr->offset >= itr->tg->offset && 115 itr->offset < itr->tg->offset + itr->tg->width) { 116 int tg_bitpos = itr->tg->offset - itr->offset; 117 118 vcap_set_bit(stream, itr, (itr->tg->value >> tg_bitpos) & 0x1); 119 itr->offset++; 120 vcap_iter_update(itr); 121 } 122 vcap_set_bit(stream, itr, val); 123 } 124 125 static void vcap_encode_field(u32 *stream, struct vcap_stream_iter *itr, 126 int width, const u8 *value) 127 { 128 int idx; 129 130 /* Loop over the field value bits and add the value bits one by one to 131 * the output stream. 132 */ 133 for (idx = 0; idx < width; idx++) { 134 u8 bidx = idx & GENMASK(2, 0); 135 136 /* Encode one field value bit */ 137 vcap_encode_bit(stream, itr, (value[idx / 8] >> bidx) & 0x1); 138 vcap_iter_next(itr); 139 } 140 } 141 142 static void vcap_encode_typegroups(u32 *stream, int sw_width, 143 const struct vcap_typegroup *tg, 144 bool mask) 145 { 146 struct vcap_stream_iter iter; 147 int idx; 148 149 /* Mask bits must be set to zeros (inverted later when writing to the 150 * mask cache register), so that the mask typegroup bits consist of 151 * match-1 or match-0, or both 152 */ 153 vcap_iter_set(&iter, sw_width, tg, 0); 154 while (iter.tg->width) { 155 /* Set position to current typegroup bit */ 156 iter.offset = iter.tg->offset; 157 vcap_iter_update(&iter); 158 for (idx = 0; idx < iter.tg->width; idx++) { 159 /* Iterate over current typegroup bits. Mask typegroup 160 * bits are always set 161 */ 162 if (mask) 163 vcap_set_bit(stream, &iter, 0x1); 164 else 165 vcap_set_bit(stream, &iter, 166 (iter.tg->value >> idx) & 0x1); 167 iter.offset++; 168 vcap_iter_update(&iter); 169 } 170 iter.tg++; /* next typegroup */ 171 } 172 } 173 174 static bool vcap_bitarray_zero(int width, u8 *value) 175 { 176 int bytes = DIV_ROUND_UP(width, BITS_PER_BYTE); 177 u8 total = 0, bmask = 0xff; 178 int rwidth = width; 179 int idx; 180 181 for (idx = 0; idx < bytes; ++idx, rwidth -= BITS_PER_BYTE) { 182 if (rwidth && rwidth < BITS_PER_BYTE) 183 bmask = (1 << rwidth) - 1; 184 total += value[idx] & bmask; 185 } 186 return total == 0; 187 } 188 189 static bool vcap_get_bit(u32 *stream, struct vcap_stream_iter *itr) 190 { 191 u32 mask = BIT(itr->reg_bitpos); 192 u32 *p = &stream[itr->reg_idx]; 193 194 return !!(*p & mask); 195 } 196 197 static void vcap_decode_field(u32 *stream, struct vcap_stream_iter *itr, 198 int width, u8 *value) 199 { 200 int idx; 201 202 /* Loop over the field value bits and get the field bits and 203 * set them in the output value byte array 204 */ 205 for (idx = 0; idx < width; idx++) { 206 u8 bidx = idx & 0x7; 207 208 /* Decode one field value bit */ 209 if (vcap_get_bit(stream, itr)) 210 *value |= 1 << bidx; 211 vcap_iter_next(itr); 212 if (bidx == 7) 213 value++; 214 } 215 } 216 217 /* Verify that the type id in the stream matches the type id of the keyset */ 218 static bool vcap_verify_keystream_keyset(struct vcap_control *vctrl, 219 enum vcap_type vt, 220 u32 *keystream, 221 u32 *mskstream, 222 enum vcap_keyfield_set keyset) 223 { 224 const struct vcap_info *vcap = &vctrl->vcaps[vt]; 225 const struct vcap_field *typefld; 226 const struct vcap_typegroup *tgt; 227 const struct vcap_field *fields; 228 struct vcap_stream_iter iter; 229 const struct vcap_set *info; 230 u32 value = 0; 231 u32 mask = 0; 232 233 if (vcap_keyfield_count(vctrl, vt, keyset) == 0) 234 return false; 235 236 info = vcap_keyfieldset(vctrl, vt, keyset); 237 /* Check that the keyset is valid */ 238 if (!info) 239 return false; 240 241 /* a type_id of value -1 means that there is no type field */ 242 if (info->type_id == (u8)-1) 243 return true; 244 245 /* Get a valid typegroup for the specific keyset */ 246 tgt = vcap_keyfield_typegroup(vctrl, vt, keyset); 247 if (!tgt) 248 return false; 249 250 fields = vcap_keyfields(vctrl, vt, keyset); 251 if (!fields) 252 return false; 253 254 typefld = &fields[VCAP_KF_TYPE]; 255 vcap_iter_init(&iter, vcap->sw_width, tgt, typefld->offset); 256 vcap_decode_field(mskstream, &iter, typefld->width, (u8 *)&mask); 257 /* no type info if there are no mask bits */ 258 if (vcap_bitarray_zero(typefld->width, (u8 *)&mask)) 259 return false; 260 261 /* Get the value of the type field in the stream and compare to the 262 * one define in the vcap keyset 263 */ 264 vcap_iter_init(&iter, vcap->sw_width, tgt, typefld->offset); 265 vcap_decode_field(keystream, &iter, typefld->width, (u8 *)&value); 266 267 return (value & mask) == (info->type_id & mask); 268 } 269 270 /* Verify that the typegroup bits have the correct values */ 271 static int vcap_verify_typegroups(u32 *stream, int sw_width, 272 const struct vcap_typegroup *tgt, bool mask, 273 int sw_max) 274 { 275 struct vcap_stream_iter iter; 276 int sw_cnt, idx; 277 278 vcap_iter_set(&iter, sw_width, tgt, 0); 279 sw_cnt = 0; 280 while (iter.tg->width) { 281 u32 value = 0; 282 u32 tg_value = iter.tg->value; 283 284 if (mask) 285 tg_value = (1 << iter.tg->width) - 1; 286 /* Set position to current typegroup bit */ 287 iter.offset = iter.tg->offset; 288 vcap_iter_update(&iter); 289 for (idx = 0; idx < iter.tg->width; idx++) { 290 /* Decode one typegroup bit */ 291 if (vcap_get_bit(stream, &iter)) 292 value |= 1 << idx; 293 iter.offset++; 294 vcap_iter_update(&iter); 295 } 296 if (value != tg_value) 297 return -EINVAL; 298 iter.tg++; /* next typegroup */ 299 sw_cnt++; 300 /* Stop checking more typegroups */ 301 if (sw_max && sw_cnt >= sw_max) 302 break; 303 } 304 return 0; 305 } 306 307 /* Find the subword width of the key typegroup that matches the stream data */ 308 static int vcap_find_keystream_typegroup_sw(struct vcap_control *vctrl, 309 enum vcap_type vt, u32 *stream, 310 bool mask, int sw_max) 311 { 312 const struct vcap_typegroup **tgt; 313 int sw_idx, res; 314 315 tgt = vctrl->vcaps[vt].keyfield_set_typegroups; 316 /* Try the longest subword match first */ 317 for (sw_idx = vctrl->vcaps[vt].sw_count; sw_idx >= 0; sw_idx--) { 318 if (!tgt[sw_idx]) 319 continue; 320 321 res = vcap_verify_typegroups(stream, vctrl->vcaps[vt].sw_width, 322 tgt[sw_idx], mask, sw_max); 323 if (res == 0) 324 return sw_idx; 325 } 326 return -EINVAL; 327 } 328 329 /* Verify that the typegroup information, subword count, keyset and type id 330 * are in sync and correct, return the list of matchin keysets 331 */ 332 int 333 vcap_find_keystream_keysets(struct vcap_control *vctrl, 334 enum vcap_type vt, 335 u32 *keystream, 336 u32 *mskstream, 337 bool mask, int sw_max, 338 struct vcap_keyset_list *kslist) 339 { 340 const struct vcap_set *keyfield_set; 341 int sw_count, idx; 342 343 sw_count = vcap_find_keystream_typegroup_sw(vctrl, vt, keystream, mask, 344 sw_max); 345 if (sw_count < 0) 346 return sw_count; 347 348 keyfield_set = vctrl->vcaps[vt].keyfield_set; 349 for (idx = 0; idx < vctrl->vcaps[vt].keyfield_set_size; ++idx) { 350 if (keyfield_set[idx].sw_per_item != sw_count) 351 continue; 352 353 if (vcap_verify_keystream_keyset(vctrl, vt, keystream, 354 mskstream, idx)) 355 vcap_keyset_list_add(kslist, idx); 356 } 357 if (kslist->cnt > 0) 358 return 0; 359 return -EINVAL; 360 } 361 EXPORT_SYMBOL_GPL(vcap_find_keystream_keysets); 362 363 /* Read key data from a VCAP address and discover if there are any rule keysets 364 * here 365 */ 366 int vcap_addr_keysets(struct vcap_control *vctrl, 367 struct net_device *ndev, 368 struct vcap_admin *admin, 369 int addr, 370 struct vcap_keyset_list *kslist) 371 { 372 enum vcap_type vt = admin->vtype; 373 int keyset_sw_regs, idx; 374 u32 key = 0, mask = 0; 375 376 /* Read the cache at the specified address */ 377 keyset_sw_regs = DIV_ROUND_UP(vctrl->vcaps[vt].sw_width, 32); 378 vctrl->ops->update(ndev, admin, VCAP_CMD_READ, VCAP_SEL_ALL, addr); 379 vctrl->ops->cache_read(ndev, admin, VCAP_SEL_ENTRY, 0, 380 keyset_sw_regs); 381 /* Skip uninitialized key/mask entries */ 382 for (idx = 0; idx < keyset_sw_regs; ++idx) { 383 key |= ~admin->cache.keystream[idx]; 384 mask |= admin->cache.maskstream[idx]; 385 } 386 if (key == 0 && mask == 0) 387 return -EINVAL; 388 /* Decode and locate the keysets */ 389 return vcap_find_keystream_keysets(vctrl, vt, admin->cache.keystream, 390 admin->cache.maskstream, false, 0, 391 kslist); 392 } 393 EXPORT_SYMBOL_GPL(vcap_addr_keysets); 394 395 /* Return the list of keyfields for the keyset */ 396 const struct vcap_field *vcap_keyfields(struct vcap_control *vctrl, 397 enum vcap_type vt, 398 enum vcap_keyfield_set keyset) 399 { 400 /* Check that the keyset exists in the vcap keyset list */ 401 if (keyset >= vctrl->vcaps[vt].keyfield_set_size) 402 return NULL; 403 return vctrl->vcaps[vt].keyfield_set_map[keyset]; 404 } 405 406 /* Return the keyset information for the keyset */ 407 const struct vcap_set *vcap_keyfieldset(struct vcap_control *vctrl, 408 enum vcap_type vt, 409 enum vcap_keyfield_set keyset) 410 { 411 const struct vcap_set *kset; 412 413 /* Check that the keyset exists in the vcap keyset list */ 414 if (keyset >= vctrl->vcaps[vt].keyfield_set_size) 415 return NULL; 416 kset = &vctrl->vcaps[vt].keyfield_set[keyset]; 417 if (kset->sw_per_item == 0 || kset->sw_per_item > vctrl->vcaps[vt].sw_count) 418 return NULL; 419 return kset; 420 } 421 EXPORT_SYMBOL_GPL(vcap_keyfieldset); 422 423 /* Return the typegroup table for the matching keyset (using subword size) */ 424 const struct vcap_typegroup * 425 vcap_keyfield_typegroup(struct vcap_control *vctrl, 426 enum vcap_type vt, enum vcap_keyfield_set keyset) 427 { 428 const struct vcap_set *kset = vcap_keyfieldset(vctrl, vt, keyset); 429 430 /* Check that the keyset is valid */ 431 if (!kset) 432 return NULL; 433 return vctrl->vcaps[vt].keyfield_set_typegroups[kset->sw_per_item]; 434 } 435 436 /* Return the number of keyfields in the keyset */ 437 int vcap_keyfield_count(struct vcap_control *vctrl, 438 enum vcap_type vt, enum vcap_keyfield_set keyset) 439 { 440 /* Check that the keyset exists in the vcap keyset list */ 441 if (keyset >= vctrl->vcaps[vt].keyfield_set_size) 442 return 0; 443 return vctrl->vcaps[vt].keyfield_set_map_size[keyset]; 444 } 445 446 static void vcap_encode_keyfield(struct vcap_rule_internal *ri, 447 const struct vcap_client_keyfield *kf, 448 const struct vcap_field *rf, 449 const struct vcap_typegroup *tgt) 450 { 451 int sw_width = ri->vctrl->vcaps[ri->admin->vtype].sw_width; 452 struct vcap_cache_data *cache = &ri->admin->cache; 453 struct vcap_stream_iter iter; 454 const u8 *value, *mask; 455 456 /* Encode the fields for the key and the mask in their respective 457 * streams, respecting the subword width. 458 */ 459 switch (kf->ctrl.type) { 460 case VCAP_FIELD_BIT: 461 value = &kf->data.u1.value; 462 mask = &kf->data.u1.mask; 463 break; 464 case VCAP_FIELD_U32: 465 value = (const u8 *)&kf->data.u32.value; 466 mask = (const u8 *)&kf->data.u32.mask; 467 break; 468 case VCAP_FIELD_U48: 469 value = kf->data.u48.value; 470 mask = kf->data.u48.mask; 471 break; 472 case VCAP_FIELD_U56: 473 value = kf->data.u56.value; 474 mask = kf->data.u56.mask; 475 break; 476 case VCAP_FIELD_U64: 477 value = kf->data.u64.value; 478 mask = kf->data.u64.mask; 479 break; 480 case VCAP_FIELD_U72: 481 value = kf->data.u72.value; 482 mask = kf->data.u72.mask; 483 break; 484 case VCAP_FIELD_U112: 485 value = kf->data.u112.value; 486 mask = kf->data.u112.mask; 487 break; 488 case VCAP_FIELD_U128: 489 value = kf->data.u128.value; 490 mask = kf->data.u128.mask; 491 break; 492 } 493 vcap_iter_init(&iter, sw_width, tgt, rf->offset); 494 vcap_encode_field(cache->keystream, &iter, rf->width, value); 495 vcap_iter_init(&iter, sw_width, tgt, rf->offset); 496 vcap_encode_field(cache->maskstream, &iter, rf->width, mask); 497 } 498 499 static void vcap_encode_keyfield_typegroups(struct vcap_control *vctrl, 500 struct vcap_rule_internal *ri, 501 const struct vcap_typegroup *tgt) 502 { 503 int sw_width = vctrl->vcaps[ri->admin->vtype].sw_width; 504 struct vcap_cache_data *cache = &ri->admin->cache; 505 506 /* Encode the typegroup bits for the key and the mask in their streams, 507 * respecting the subword width. 508 */ 509 vcap_encode_typegroups(cache->keystream, sw_width, tgt, false); 510 vcap_encode_typegroups(cache->maskstream, sw_width, tgt, true); 511 } 512 513 /* Copy data from src to dst but reverse the data in chunks of 32bits. 514 * For example if src is 00:11:22:33:44:55 where 55 is LSB the dst will 515 * have the value 22:33:44:55:00:11. 516 */ 517 static void vcap_copy_to_w32be(u8 *dst, const u8 *src, int size) 518 { 519 for (int idx = 0; idx < size; ++idx) { 520 int first_byte_index = 0; 521 int nidx; 522 523 first_byte_index = size - (((idx >> 2) + 1) << 2); 524 if (first_byte_index < 0) 525 first_byte_index = 0; 526 nidx = idx + first_byte_index - (idx & ~0x3); 527 dst[nidx] = src[idx]; 528 } 529 } 530 531 static void 532 vcap_copy_from_client_keyfield(struct vcap_rule *rule, 533 struct vcap_client_keyfield *dst, 534 const struct vcap_client_keyfield *src) 535 { 536 struct vcap_rule_internal *ri = to_intrule(rule); 537 const struct vcap_client_keyfield_data *sdata; 538 struct vcap_client_keyfield_data *ddata; 539 int size; 540 541 dst->ctrl.type = src->ctrl.type; 542 dst->ctrl.key = src->ctrl.key; 543 INIT_LIST_HEAD(&dst->ctrl.list); 544 sdata = &src->data; 545 ddata = &dst->data; 546 547 if (!ri->admin->w32be) { 548 memcpy(ddata, sdata, sizeof(dst->data)); 549 return; 550 } 551 552 size = keyfield_size_table[dst->ctrl.type] / 2; 553 554 switch (dst->ctrl.type) { 555 case VCAP_FIELD_BIT: 556 case VCAP_FIELD_U32: 557 memcpy(ddata, sdata, sizeof(dst->data)); 558 break; 559 case VCAP_FIELD_U48: 560 vcap_copy_to_w32be(ddata->u48.value, src->data.u48.value, size); 561 vcap_copy_to_w32be(ddata->u48.mask, src->data.u48.mask, size); 562 break; 563 case VCAP_FIELD_U56: 564 vcap_copy_to_w32be(ddata->u56.value, sdata->u56.value, size); 565 vcap_copy_to_w32be(ddata->u56.mask, sdata->u56.mask, size); 566 break; 567 case VCAP_FIELD_U64: 568 vcap_copy_to_w32be(ddata->u64.value, sdata->u64.value, size); 569 vcap_copy_to_w32be(ddata->u64.mask, sdata->u64.mask, size); 570 break; 571 case VCAP_FIELD_U72: 572 vcap_copy_to_w32be(ddata->u72.value, sdata->u72.value, size); 573 vcap_copy_to_w32be(ddata->u72.mask, sdata->u72.mask, size); 574 break; 575 case VCAP_FIELD_U112: 576 vcap_copy_to_w32be(ddata->u112.value, sdata->u112.value, size); 577 vcap_copy_to_w32be(ddata->u112.mask, sdata->u112.mask, size); 578 break; 579 case VCAP_FIELD_U128: 580 vcap_copy_to_w32be(ddata->u128.value, sdata->u128.value, size); 581 vcap_copy_to_w32be(ddata->u128.mask, sdata->u128.mask, size); 582 break; 583 } 584 } 585 586 static void 587 vcap_copy_from_client_actionfield(struct vcap_rule *rule, 588 struct vcap_client_actionfield *dst, 589 const struct vcap_client_actionfield *src) 590 { 591 struct vcap_rule_internal *ri = to_intrule(rule); 592 const struct vcap_client_actionfield_data *sdata; 593 struct vcap_client_actionfield_data *ddata; 594 int size; 595 596 dst->ctrl.type = src->ctrl.type; 597 dst->ctrl.action = src->ctrl.action; 598 INIT_LIST_HEAD(&dst->ctrl.list); 599 sdata = &src->data; 600 ddata = &dst->data; 601 602 if (!ri->admin->w32be) { 603 memcpy(ddata, sdata, sizeof(dst->data)); 604 return; 605 } 606 607 size = actionfield_size_table[dst->ctrl.type]; 608 609 switch (dst->ctrl.type) { 610 case VCAP_FIELD_BIT: 611 case VCAP_FIELD_U32: 612 memcpy(ddata, sdata, sizeof(dst->data)); 613 break; 614 case VCAP_FIELD_U48: 615 vcap_copy_to_w32be(ddata->u48.value, sdata->u48.value, size); 616 break; 617 case VCAP_FIELD_U56: 618 vcap_copy_to_w32be(ddata->u56.value, sdata->u56.value, size); 619 break; 620 case VCAP_FIELD_U64: 621 vcap_copy_to_w32be(ddata->u64.value, sdata->u64.value, size); 622 break; 623 case VCAP_FIELD_U72: 624 vcap_copy_to_w32be(ddata->u72.value, sdata->u72.value, size); 625 break; 626 case VCAP_FIELD_U112: 627 vcap_copy_to_w32be(ddata->u112.value, sdata->u112.value, size); 628 break; 629 case VCAP_FIELD_U128: 630 vcap_copy_to_w32be(ddata->u128.value, sdata->u128.value, size); 631 break; 632 } 633 } 634 635 static int vcap_encode_rule_keyset(struct vcap_rule_internal *ri) 636 { 637 const struct vcap_client_keyfield *ckf; 638 const struct vcap_typegroup *tg_table; 639 struct vcap_client_keyfield tempkf; 640 const struct vcap_field *kf_table; 641 int keyset_size; 642 643 /* Get a valid set of fields for the specific keyset */ 644 kf_table = vcap_keyfields(ri->vctrl, ri->admin->vtype, ri->data.keyset); 645 if (!kf_table) { 646 pr_err("%s:%d: no fields available for this keyset: %d\n", 647 __func__, __LINE__, ri->data.keyset); 648 return -EINVAL; 649 } 650 /* Get a valid typegroup for the specific keyset */ 651 tg_table = vcap_keyfield_typegroup(ri->vctrl, ri->admin->vtype, 652 ri->data.keyset); 653 if (!tg_table) { 654 pr_err("%s:%d: no typegroups available for this keyset: %d\n", 655 __func__, __LINE__, ri->data.keyset); 656 return -EINVAL; 657 } 658 /* Get a valid size for the specific keyset */ 659 keyset_size = vcap_keyfield_count(ri->vctrl, ri->admin->vtype, 660 ri->data.keyset); 661 if (keyset_size == 0) { 662 pr_err("%s:%d: zero field count for this keyset: %d\n", 663 __func__, __LINE__, ri->data.keyset); 664 return -EINVAL; 665 } 666 /* Iterate over the keyfields (key, mask) in the rule 667 * and encode these bits 668 */ 669 if (list_empty(&ri->data.keyfields)) { 670 pr_err("%s:%d: no keyfields in the rule\n", __func__, __LINE__); 671 return -EINVAL; 672 } 673 list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list) { 674 /* Check that the client entry exists in the keyset */ 675 if (ckf->ctrl.key >= keyset_size) { 676 pr_err("%s:%d: key %d is not in vcap\n", 677 __func__, __LINE__, ckf->ctrl.key); 678 return -EINVAL; 679 } 680 vcap_copy_from_client_keyfield(&ri->data, &tempkf, ckf); 681 vcap_encode_keyfield(ri, &tempkf, &kf_table[ckf->ctrl.key], 682 tg_table); 683 } 684 /* Add typegroup bits to the key/mask bitstreams */ 685 vcap_encode_keyfield_typegroups(ri->vctrl, ri, tg_table); 686 return 0; 687 } 688 689 /* Return the list of actionfields for the actionset */ 690 const struct vcap_field * 691 vcap_actionfields(struct vcap_control *vctrl, 692 enum vcap_type vt, enum vcap_actionfield_set actionset) 693 { 694 /* Check that the actionset exists in the vcap actionset list */ 695 if (actionset >= vctrl->vcaps[vt].actionfield_set_size) 696 return NULL; 697 return vctrl->vcaps[vt].actionfield_set_map[actionset]; 698 } 699 700 const struct vcap_set * 701 vcap_actionfieldset(struct vcap_control *vctrl, 702 enum vcap_type vt, enum vcap_actionfield_set actionset) 703 { 704 const struct vcap_set *aset; 705 706 /* Check that the actionset exists in the vcap actionset list */ 707 if (actionset >= vctrl->vcaps[vt].actionfield_set_size) 708 return NULL; 709 aset = &vctrl->vcaps[vt].actionfield_set[actionset]; 710 if (aset->sw_per_item == 0 || aset->sw_per_item > vctrl->vcaps[vt].sw_count) 711 return NULL; 712 return aset; 713 } 714 715 /* Return the typegroup table for the matching actionset (using subword size) */ 716 const struct vcap_typegroup * 717 vcap_actionfield_typegroup(struct vcap_control *vctrl, 718 enum vcap_type vt, enum vcap_actionfield_set actionset) 719 { 720 const struct vcap_set *aset = vcap_actionfieldset(vctrl, vt, actionset); 721 722 /* Check that the actionset is valid */ 723 if (!aset) 724 return NULL; 725 return vctrl->vcaps[vt].actionfield_set_typegroups[aset->sw_per_item]; 726 } 727 728 /* Return the number of actionfields in the actionset */ 729 int vcap_actionfield_count(struct vcap_control *vctrl, 730 enum vcap_type vt, 731 enum vcap_actionfield_set actionset) 732 { 733 /* Check that the actionset exists in the vcap actionset list */ 734 if (actionset >= vctrl->vcaps[vt].actionfield_set_size) 735 return 0; 736 return vctrl->vcaps[vt].actionfield_set_map_size[actionset]; 737 } 738 739 static void vcap_encode_actionfield(struct vcap_rule_internal *ri, 740 const struct vcap_client_actionfield *af, 741 const struct vcap_field *rf, 742 const struct vcap_typegroup *tgt) 743 { 744 int act_width = ri->vctrl->vcaps[ri->admin->vtype].act_width; 745 746 struct vcap_cache_data *cache = &ri->admin->cache; 747 struct vcap_stream_iter iter; 748 const u8 *value; 749 750 /* Encode the action field in the stream, respecting the subword width */ 751 switch (af->ctrl.type) { 752 case VCAP_FIELD_BIT: 753 value = &af->data.u1.value; 754 break; 755 case VCAP_FIELD_U32: 756 value = (const u8 *)&af->data.u32.value; 757 break; 758 case VCAP_FIELD_U48: 759 value = af->data.u48.value; 760 break; 761 case VCAP_FIELD_U56: 762 value = af->data.u56.value; 763 break; 764 case VCAP_FIELD_U64: 765 value = af->data.u64.value; 766 break; 767 case VCAP_FIELD_U72: 768 value = af->data.u72.value; 769 break; 770 case VCAP_FIELD_U112: 771 value = af->data.u112.value; 772 break; 773 case VCAP_FIELD_U128: 774 value = af->data.u128.value; 775 break; 776 } 777 vcap_iter_init(&iter, act_width, tgt, rf->offset); 778 vcap_encode_field(cache->actionstream, &iter, rf->width, value); 779 } 780 781 static void vcap_encode_actionfield_typegroups(struct vcap_rule_internal *ri, 782 const struct vcap_typegroup *tgt) 783 { 784 int sw_width = ri->vctrl->vcaps[ri->admin->vtype].act_width; 785 struct vcap_cache_data *cache = &ri->admin->cache; 786 787 /* Encode the typegroup bits for the actionstream respecting the subword 788 * width. 789 */ 790 vcap_encode_typegroups(cache->actionstream, sw_width, tgt, false); 791 } 792 793 static int vcap_encode_rule_actionset(struct vcap_rule_internal *ri) 794 { 795 const struct vcap_client_actionfield *caf; 796 const struct vcap_typegroup *tg_table; 797 struct vcap_client_actionfield tempaf; 798 const struct vcap_field *af_table; 799 int actionset_size; 800 801 /* Get a valid set of actionset fields for the specific actionset */ 802 af_table = vcap_actionfields(ri->vctrl, ri->admin->vtype, 803 ri->data.actionset); 804 if (!af_table) { 805 pr_err("%s:%d: no fields available for this actionset: %d\n", 806 __func__, __LINE__, ri->data.actionset); 807 return -EINVAL; 808 } 809 /* Get a valid typegroup for the specific actionset */ 810 tg_table = vcap_actionfield_typegroup(ri->vctrl, ri->admin->vtype, 811 ri->data.actionset); 812 if (!tg_table) { 813 pr_err("%s:%d: no typegroups available for this actionset: %d\n", 814 __func__, __LINE__, ri->data.actionset); 815 return -EINVAL; 816 } 817 /* Get a valid actionset size for the specific actionset */ 818 actionset_size = vcap_actionfield_count(ri->vctrl, ri->admin->vtype, 819 ri->data.actionset); 820 if (actionset_size == 0) { 821 pr_err("%s:%d: zero field count for this actionset: %d\n", 822 __func__, __LINE__, ri->data.actionset); 823 return -EINVAL; 824 } 825 /* Iterate over the actionfields in the rule 826 * and encode these bits 827 */ 828 if (list_empty(&ri->data.actionfields)) 829 pr_warn("%s:%d: no actionfields in the rule\n", 830 __func__, __LINE__); 831 list_for_each_entry(caf, &ri->data.actionfields, ctrl.list) { 832 /* Check that the client action exists in the actionset */ 833 if (caf->ctrl.action >= actionset_size) { 834 pr_err("%s:%d: action %d is not in vcap\n", 835 __func__, __LINE__, caf->ctrl.action); 836 return -EINVAL; 837 } 838 vcap_copy_from_client_actionfield(&ri->data, &tempaf, caf); 839 vcap_encode_actionfield(ri, &tempaf, 840 &af_table[caf->ctrl.action], tg_table); 841 } 842 /* Add typegroup bits to the entry bitstreams */ 843 vcap_encode_actionfield_typegroups(ri, tg_table); 844 return 0; 845 } 846 847 static int vcap_encode_rule(struct vcap_rule_internal *ri) 848 { 849 int err; 850 851 err = vcap_encode_rule_keyset(ri); 852 if (err) 853 return err; 854 err = vcap_encode_rule_actionset(ri); 855 if (err) 856 return err; 857 return 0; 858 } 859 860 int vcap_api_check(struct vcap_control *ctrl) 861 { 862 if (!ctrl) { 863 pr_err("%s:%d: vcap control is missing\n", __func__, __LINE__); 864 return -EINVAL; 865 } 866 if (!ctrl->ops || !ctrl->ops->validate_keyset || 867 !ctrl->ops->add_default_fields || !ctrl->ops->cache_erase || 868 !ctrl->ops->cache_write || !ctrl->ops->cache_read || 869 !ctrl->ops->init || !ctrl->ops->update || !ctrl->ops->move || 870 !ctrl->ops->port_info) { 871 pr_err("%s:%d: client operations are missing\n", 872 __func__, __LINE__); 873 return -ENOENT; 874 } 875 return 0; 876 } 877 878 void vcap_erase_cache(struct vcap_rule_internal *ri) 879 { 880 ri->vctrl->ops->cache_erase(ri->admin); 881 } 882 883 /* Update the keyset for the rule */ 884 int vcap_set_rule_set_keyset(struct vcap_rule *rule, 885 enum vcap_keyfield_set keyset) 886 { 887 struct vcap_rule_internal *ri = to_intrule(rule); 888 const struct vcap_set *kset; 889 int sw_width; 890 891 kset = vcap_keyfieldset(ri->vctrl, ri->admin->vtype, keyset); 892 /* Check that the keyset is valid */ 893 if (!kset) 894 return -EINVAL; 895 ri->keyset_sw = kset->sw_per_item; 896 sw_width = ri->vctrl->vcaps[ri->admin->vtype].sw_width; 897 ri->keyset_sw_regs = DIV_ROUND_UP(sw_width, 32); 898 ri->data.keyset = keyset; 899 return 0; 900 } 901 EXPORT_SYMBOL_GPL(vcap_set_rule_set_keyset); 902 903 /* Update the actionset for the rule */ 904 int vcap_set_rule_set_actionset(struct vcap_rule *rule, 905 enum vcap_actionfield_set actionset) 906 { 907 struct vcap_rule_internal *ri = to_intrule(rule); 908 const struct vcap_set *aset; 909 int act_width; 910 911 aset = vcap_actionfieldset(ri->vctrl, ri->admin->vtype, actionset); 912 /* Check that the actionset is valid */ 913 if (!aset) 914 return -EINVAL; 915 ri->actionset_sw = aset->sw_per_item; 916 act_width = ri->vctrl->vcaps[ri->admin->vtype].act_width; 917 ri->actionset_sw_regs = DIV_ROUND_UP(act_width, 32); 918 ri->data.actionset = actionset; 919 return 0; 920 } 921 EXPORT_SYMBOL_GPL(vcap_set_rule_set_actionset); 922 923 /* Check if a rule with this id exists */ 924 static bool vcap_rule_exists(struct vcap_control *vctrl, u32 id) 925 { 926 struct vcap_rule_internal *ri; 927 struct vcap_admin *admin; 928 929 /* Look for the rule id in all vcaps */ 930 list_for_each_entry(admin, &vctrl->list, list) 931 list_for_each_entry(ri, &admin->rules, list) 932 if (ri->data.id == id) 933 return true; 934 return false; 935 } 936 937 /* Find a rule with a provided rule id return a locked vcap */ 938 static struct vcap_rule_internal * 939 vcap_get_locked_rule(struct vcap_control *vctrl, u32 id) 940 { 941 struct vcap_rule_internal *ri; 942 struct vcap_admin *admin; 943 944 /* Look for the rule id in all vcaps */ 945 list_for_each_entry(admin, &vctrl->list, list) { 946 mutex_lock(&admin->lock); 947 list_for_each_entry(ri, &admin->rules, list) 948 if (ri->data.id == id) 949 return ri; 950 mutex_unlock(&admin->lock); 951 } 952 return NULL; 953 } 954 955 /* Find a rule id with a provided cookie */ 956 int vcap_lookup_rule_by_cookie(struct vcap_control *vctrl, u64 cookie) 957 { 958 struct vcap_rule_internal *ri; 959 struct vcap_admin *admin; 960 int id = 0; 961 962 /* Look for the rule id in all vcaps */ 963 list_for_each_entry(admin, &vctrl->list, list) { 964 mutex_lock(&admin->lock); 965 list_for_each_entry(ri, &admin->rules, list) { 966 if (ri->data.cookie == cookie) { 967 id = ri->data.id; 968 break; 969 } 970 } 971 mutex_unlock(&admin->lock); 972 if (id) 973 return id; 974 } 975 return -ENOENT; 976 } 977 EXPORT_SYMBOL_GPL(vcap_lookup_rule_by_cookie); 978 979 /* Make a copy of the rule, shallow or full */ 980 static struct vcap_rule_internal *vcap_dup_rule(struct vcap_rule_internal *ri, 981 bool full) 982 { 983 struct vcap_client_actionfield *caf, *newcaf; 984 struct vcap_client_keyfield *ckf, *newckf; 985 struct vcap_rule_internal *duprule; 986 987 /* Allocate the client part */ 988 duprule = kzalloc(sizeof(*duprule), GFP_KERNEL); 989 if (!duprule) 990 return ERR_PTR(-ENOMEM); 991 *duprule = *ri; 992 /* Not inserted in the VCAP */ 993 INIT_LIST_HEAD(&duprule->list); 994 /* No elements in these lists */ 995 INIT_LIST_HEAD(&duprule->data.keyfields); 996 INIT_LIST_HEAD(&duprule->data.actionfields); 997 998 /* A full rule copy includes keys and actions */ 999 if (!full) 1000 return duprule; 1001 1002 list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list) { 1003 newckf = kmemdup(ckf, sizeof(*newckf), GFP_KERNEL); 1004 if (!newckf) 1005 return ERR_PTR(-ENOMEM); 1006 list_add_tail(&newckf->ctrl.list, &duprule->data.keyfields); 1007 } 1008 1009 list_for_each_entry(caf, &ri->data.actionfields, ctrl.list) { 1010 newcaf = kmemdup(caf, sizeof(*newcaf), GFP_KERNEL); 1011 if (!newcaf) 1012 return ERR_PTR(-ENOMEM); 1013 list_add_tail(&newcaf->ctrl.list, &duprule->data.actionfields); 1014 } 1015 1016 return duprule; 1017 } 1018 1019 static void vcap_apply_width(u8 *dst, int width, int bytes) 1020 { 1021 u8 bmask; 1022 int idx; 1023 1024 for (idx = 0; idx < bytes; idx++) { 1025 if (width > 0) 1026 if (width < 8) 1027 bmask = (1 << width) - 1; 1028 else 1029 bmask = ~0; 1030 else 1031 bmask = 0; 1032 dst[idx] &= bmask; 1033 width -= 8; 1034 } 1035 } 1036 1037 static void vcap_copy_from_w32be(u8 *dst, u8 *src, int size, int width) 1038 { 1039 int idx, ridx, wstart, nidx; 1040 int tail_bytes = (((size + 4) >> 2) << 2) - size; 1041 1042 for (idx = 0, ridx = size - 1; idx < size; ++idx, --ridx) { 1043 wstart = (idx >> 2) << 2; 1044 nidx = wstart + 3 - (idx & 0x3); 1045 if (nidx >= size) 1046 nidx -= tail_bytes; 1047 dst[nidx] = src[ridx]; 1048 } 1049 1050 vcap_apply_width(dst, width, size); 1051 } 1052 1053 static void vcap_copy_action_bit_field(struct vcap_u1_action *field, u8 *value) 1054 { 1055 field->value = (*value) & 0x1; 1056 } 1057 1058 static void vcap_copy_limited_actionfield(u8 *dstvalue, u8 *srcvalue, 1059 int width, int bytes) 1060 { 1061 memcpy(dstvalue, srcvalue, bytes); 1062 vcap_apply_width(dstvalue, width, bytes); 1063 } 1064 1065 static void vcap_copy_to_client_actionfield(struct vcap_rule_internal *ri, 1066 struct vcap_client_actionfield *field, 1067 u8 *value, u16 width) 1068 { 1069 int field_size = actionfield_size_table[field->ctrl.type]; 1070 1071 if (ri->admin->w32be) { 1072 switch (field->ctrl.type) { 1073 case VCAP_FIELD_BIT: 1074 vcap_copy_action_bit_field(&field->data.u1, value); 1075 break; 1076 case VCAP_FIELD_U32: 1077 vcap_copy_limited_actionfield((u8 *)&field->data.u32.value, 1078 value, 1079 width, field_size); 1080 break; 1081 case VCAP_FIELD_U48: 1082 vcap_copy_from_w32be(field->data.u48.value, value, 1083 field_size, width); 1084 break; 1085 case VCAP_FIELD_U56: 1086 vcap_copy_from_w32be(field->data.u56.value, value, 1087 field_size, width); 1088 break; 1089 case VCAP_FIELD_U64: 1090 vcap_copy_from_w32be(field->data.u64.value, value, 1091 field_size, width); 1092 break; 1093 case VCAP_FIELD_U72: 1094 vcap_copy_from_w32be(field->data.u72.value, value, 1095 field_size, width); 1096 break; 1097 case VCAP_FIELD_U112: 1098 vcap_copy_from_w32be(field->data.u112.value, value, 1099 field_size, width); 1100 break; 1101 case VCAP_FIELD_U128: 1102 vcap_copy_from_w32be(field->data.u128.value, value, 1103 field_size, width); 1104 break; 1105 }; 1106 } else { 1107 switch (field->ctrl.type) { 1108 case VCAP_FIELD_BIT: 1109 vcap_copy_action_bit_field(&field->data.u1, value); 1110 break; 1111 case VCAP_FIELD_U32: 1112 vcap_copy_limited_actionfield((u8 *)&field->data.u32.value, 1113 value, 1114 width, field_size); 1115 break; 1116 case VCAP_FIELD_U48: 1117 vcap_copy_limited_actionfield(field->data.u48.value, 1118 value, 1119 width, field_size); 1120 break; 1121 case VCAP_FIELD_U56: 1122 vcap_copy_limited_actionfield(field->data.u56.value, 1123 value, 1124 width, field_size); 1125 break; 1126 case VCAP_FIELD_U64: 1127 vcap_copy_limited_actionfield(field->data.u64.value, 1128 value, 1129 width, field_size); 1130 break; 1131 case VCAP_FIELD_U72: 1132 vcap_copy_limited_actionfield(field->data.u72.value, 1133 value, 1134 width, field_size); 1135 break; 1136 case VCAP_FIELD_U112: 1137 vcap_copy_limited_actionfield(field->data.u112.value, 1138 value, 1139 width, field_size); 1140 break; 1141 case VCAP_FIELD_U128: 1142 vcap_copy_limited_actionfield(field->data.u128.value, 1143 value, 1144 width, field_size); 1145 break; 1146 }; 1147 } 1148 } 1149 1150 static void vcap_copy_key_bit_field(struct vcap_u1_key *field, 1151 u8 *value, u8 *mask) 1152 { 1153 field->value = (*value) & 0x1; 1154 field->mask = (*mask) & 0x1; 1155 } 1156 1157 static void vcap_copy_limited_keyfield(u8 *dstvalue, u8 *dstmask, 1158 u8 *srcvalue, u8 *srcmask, 1159 int width, int bytes) 1160 { 1161 memcpy(dstvalue, srcvalue, bytes); 1162 vcap_apply_width(dstvalue, width, bytes); 1163 memcpy(dstmask, srcmask, bytes); 1164 vcap_apply_width(dstmask, width, bytes); 1165 } 1166 1167 static void vcap_copy_to_client_keyfield(struct vcap_rule_internal *ri, 1168 struct vcap_client_keyfield *field, 1169 u8 *value, u8 *mask, u16 width) 1170 { 1171 int field_size = keyfield_size_table[field->ctrl.type] / 2; 1172 1173 if (ri->admin->w32be) { 1174 switch (field->ctrl.type) { 1175 case VCAP_FIELD_BIT: 1176 vcap_copy_key_bit_field(&field->data.u1, value, mask); 1177 break; 1178 case VCAP_FIELD_U32: 1179 vcap_copy_limited_keyfield((u8 *)&field->data.u32.value, 1180 (u8 *)&field->data.u32.mask, 1181 value, mask, 1182 width, field_size); 1183 break; 1184 case VCAP_FIELD_U48: 1185 vcap_copy_from_w32be(field->data.u48.value, value, 1186 field_size, width); 1187 vcap_copy_from_w32be(field->data.u48.mask, mask, 1188 field_size, width); 1189 break; 1190 case VCAP_FIELD_U56: 1191 vcap_copy_from_w32be(field->data.u56.value, value, 1192 field_size, width); 1193 vcap_copy_from_w32be(field->data.u56.mask, mask, 1194 field_size, width); 1195 break; 1196 case VCAP_FIELD_U64: 1197 vcap_copy_from_w32be(field->data.u64.value, value, 1198 field_size, width); 1199 vcap_copy_from_w32be(field->data.u64.mask, mask, 1200 field_size, width); 1201 break; 1202 case VCAP_FIELD_U72: 1203 vcap_copy_from_w32be(field->data.u72.value, value, 1204 field_size, width); 1205 vcap_copy_from_w32be(field->data.u72.mask, mask, 1206 field_size, width); 1207 break; 1208 case VCAP_FIELD_U112: 1209 vcap_copy_from_w32be(field->data.u112.value, value, 1210 field_size, width); 1211 vcap_copy_from_w32be(field->data.u112.mask, mask, 1212 field_size, width); 1213 break; 1214 case VCAP_FIELD_U128: 1215 vcap_copy_from_w32be(field->data.u128.value, value, 1216 field_size, width); 1217 vcap_copy_from_w32be(field->data.u128.mask, mask, 1218 field_size, width); 1219 break; 1220 }; 1221 } else { 1222 switch (field->ctrl.type) { 1223 case VCAP_FIELD_BIT: 1224 vcap_copy_key_bit_field(&field->data.u1, value, mask); 1225 break; 1226 case VCAP_FIELD_U32: 1227 vcap_copy_limited_keyfield((u8 *)&field->data.u32.value, 1228 (u8 *)&field->data.u32.mask, 1229 value, mask, 1230 width, field_size); 1231 break; 1232 case VCAP_FIELD_U48: 1233 vcap_copy_limited_keyfield(field->data.u48.value, 1234 field->data.u48.mask, 1235 value, mask, 1236 width, field_size); 1237 break; 1238 case VCAP_FIELD_U56: 1239 vcap_copy_limited_keyfield(field->data.u56.value, 1240 field->data.u56.mask, 1241 value, mask, 1242 width, field_size); 1243 break; 1244 case VCAP_FIELD_U64: 1245 vcap_copy_limited_keyfield(field->data.u64.value, 1246 field->data.u64.mask, 1247 value, mask, 1248 width, field_size); 1249 break; 1250 case VCAP_FIELD_U72: 1251 vcap_copy_limited_keyfield(field->data.u72.value, 1252 field->data.u72.mask, 1253 value, mask, 1254 width, field_size); 1255 break; 1256 case VCAP_FIELD_U112: 1257 vcap_copy_limited_keyfield(field->data.u112.value, 1258 field->data.u112.mask, 1259 value, mask, 1260 width, field_size); 1261 break; 1262 case VCAP_FIELD_U128: 1263 vcap_copy_limited_keyfield(field->data.u128.value, 1264 field->data.u128.mask, 1265 value, mask, 1266 width, field_size); 1267 break; 1268 }; 1269 } 1270 } 1271 1272 static void vcap_rule_alloc_keyfield(struct vcap_rule_internal *ri, 1273 const struct vcap_field *keyfield, 1274 enum vcap_key_field key, 1275 u8 *value, u8 *mask) 1276 { 1277 struct vcap_client_keyfield *field; 1278 1279 field = kzalloc(sizeof(*field), GFP_KERNEL); 1280 if (!field) 1281 return; 1282 INIT_LIST_HEAD(&field->ctrl.list); 1283 field->ctrl.key = key; 1284 field->ctrl.type = keyfield->type; 1285 vcap_copy_to_client_keyfield(ri, field, value, mask, keyfield->width); 1286 list_add_tail(&field->ctrl.list, &ri->data.keyfields); 1287 } 1288 1289 /* Read key data from a VCAP address and discover if there is a rule keyset 1290 * here 1291 */ 1292 static bool 1293 vcap_verify_actionstream_actionset(struct vcap_control *vctrl, 1294 enum vcap_type vt, 1295 u32 *actionstream, 1296 enum vcap_actionfield_set actionset) 1297 { 1298 const struct vcap_typegroup *tgt; 1299 const struct vcap_field *fields; 1300 const struct vcap_set *info; 1301 1302 if (vcap_actionfield_count(vctrl, vt, actionset) == 0) 1303 return false; 1304 1305 info = vcap_actionfieldset(vctrl, vt, actionset); 1306 /* Check that the actionset is valid */ 1307 if (!info) 1308 return false; 1309 1310 /* a type_id of value -1 means that there is no type field */ 1311 if (info->type_id == (u8)-1) 1312 return true; 1313 1314 /* Get a valid typegroup for the specific actionset */ 1315 tgt = vcap_actionfield_typegroup(vctrl, vt, actionset); 1316 if (!tgt) 1317 return false; 1318 1319 fields = vcap_actionfields(vctrl, vt, actionset); 1320 if (!fields) 1321 return false; 1322 1323 /* Later this will be expanded with a check of the type id */ 1324 return true; 1325 } 1326 1327 /* Find the subword width of the action typegroup that matches the stream data 1328 */ 1329 static int vcap_find_actionstream_typegroup_sw(struct vcap_control *vctrl, 1330 enum vcap_type vt, u32 *stream, 1331 int sw_max) 1332 { 1333 const struct vcap_typegroup **tgt; 1334 int sw_idx, res; 1335 1336 tgt = vctrl->vcaps[vt].actionfield_set_typegroups; 1337 /* Try the longest subword match first */ 1338 for (sw_idx = vctrl->vcaps[vt].sw_count; sw_idx >= 0; sw_idx--) { 1339 if (!tgt[sw_idx]) 1340 continue; 1341 res = vcap_verify_typegroups(stream, vctrl->vcaps[vt].act_width, 1342 tgt[sw_idx], false, sw_max); 1343 if (res == 0) 1344 return sw_idx; 1345 } 1346 return -EINVAL; 1347 } 1348 1349 /* Verify that the typegroup information, subword count, actionset and type id 1350 * are in sync and correct, return the actionset 1351 */ 1352 static enum vcap_actionfield_set 1353 vcap_find_actionstream_actionset(struct vcap_control *vctrl, 1354 enum vcap_type vt, 1355 u32 *stream, 1356 int sw_max) 1357 { 1358 const struct vcap_set *actionfield_set; 1359 int sw_count, idx; 1360 bool res; 1361 1362 sw_count = vcap_find_actionstream_typegroup_sw(vctrl, vt, stream, 1363 sw_max); 1364 if (sw_count < 0) 1365 return sw_count; 1366 1367 actionfield_set = vctrl->vcaps[vt].actionfield_set; 1368 for (idx = 0; idx < vctrl->vcaps[vt].actionfield_set_size; ++idx) { 1369 if (actionfield_set[idx].sw_per_item != sw_count) 1370 continue; 1371 1372 res = vcap_verify_actionstream_actionset(vctrl, vt, 1373 stream, idx); 1374 if (res) 1375 return idx; 1376 } 1377 return -EINVAL; 1378 } 1379 1380 /* Store action value in an element in a list for the client */ 1381 static void vcap_rule_alloc_actionfield(struct vcap_rule_internal *ri, 1382 const struct vcap_field *actionfield, 1383 enum vcap_action_field action, 1384 u8 *value) 1385 { 1386 struct vcap_client_actionfield *field; 1387 1388 field = kzalloc(sizeof(*field), GFP_KERNEL); 1389 if (!field) 1390 return; 1391 INIT_LIST_HEAD(&field->ctrl.list); 1392 field->ctrl.action = action; 1393 field->ctrl.type = actionfield->type; 1394 vcap_copy_to_client_actionfield(ri, field, value, actionfield->width); 1395 list_add_tail(&field->ctrl.list, &ri->data.actionfields); 1396 } 1397 1398 static int vcap_decode_actionset(struct vcap_rule_internal *ri) 1399 { 1400 struct vcap_control *vctrl = ri->vctrl; 1401 struct vcap_admin *admin = ri->admin; 1402 const struct vcap_field *actionfield; 1403 enum vcap_actionfield_set actionset; 1404 enum vcap_type vt = admin->vtype; 1405 const struct vcap_typegroup *tgt; 1406 struct vcap_stream_iter iter; 1407 int idx, res, actfield_count; 1408 u32 *actstream; 1409 u8 value[16]; 1410 1411 actstream = admin->cache.actionstream; 1412 res = vcap_find_actionstream_actionset(vctrl, vt, actstream, 0); 1413 if (res < 0) { 1414 pr_err("%s:%d: could not find valid actionset: %d\n", 1415 __func__, __LINE__, res); 1416 return -EINVAL; 1417 } 1418 actionset = res; 1419 actfield_count = vcap_actionfield_count(vctrl, vt, actionset); 1420 actionfield = vcap_actionfields(vctrl, vt, actionset); 1421 tgt = vcap_actionfield_typegroup(vctrl, vt, actionset); 1422 /* Start decoding the stream */ 1423 for (idx = 0; idx < actfield_count; ++idx) { 1424 if (actionfield[idx].width <= 0) 1425 continue; 1426 /* Get the action */ 1427 memset(value, 0, DIV_ROUND_UP(actionfield[idx].width, 8)); 1428 vcap_iter_init(&iter, vctrl->vcaps[vt].act_width, tgt, 1429 actionfield[idx].offset); 1430 vcap_decode_field(actstream, &iter, actionfield[idx].width, 1431 value); 1432 /* Skip if no bits are set */ 1433 if (vcap_bitarray_zero(actionfield[idx].width, value)) 1434 continue; 1435 vcap_rule_alloc_actionfield(ri, &actionfield[idx], idx, value); 1436 /* Later the action id will also be checked */ 1437 } 1438 return vcap_set_rule_set_actionset((struct vcap_rule *)ri, actionset); 1439 } 1440 1441 static int vcap_decode_keyset(struct vcap_rule_internal *ri) 1442 { 1443 struct vcap_control *vctrl = ri->vctrl; 1444 struct vcap_stream_iter kiter, miter; 1445 struct vcap_admin *admin = ri->admin; 1446 enum vcap_keyfield_set keysets[10]; 1447 const struct vcap_field *keyfield; 1448 enum vcap_type vt = admin->vtype; 1449 const struct vcap_typegroup *tgt; 1450 struct vcap_keyset_list matches; 1451 enum vcap_keyfield_set keyset; 1452 int idx, res, keyfield_count; 1453 u32 *maskstream; 1454 u32 *keystream; 1455 u8 value[16]; 1456 u8 mask[16]; 1457 1458 keystream = admin->cache.keystream; 1459 maskstream = admin->cache.maskstream; 1460 matches.keysets = keysets; 1461 matches.cnt = 0; 1462 matches.max = ARRAY_SIZE(keysets); 1463 res = vcap_find_keystream_keysets(vctrl, vt, keystream, maskstream, 1464 false, 0, &matches); 1465 if (res < 0) { 1466 pr_err("%s:%d: could not find valid keysets: %d\n", 1467 __func__, __LINE__, res); 1468 return -EINVAL; 1469 } 1470 keyset = matches.keysets[0]; 1471 keyfield_count = vcap_keyfield_count(vctrl, vt, keyset); 1472 keyfield = vcap_keyfields(vctrl, vt, keyset); 1473 tgt = vcap_keyfield_typegroup(vctrl, vt, keyset); 1474 /* Start decoding the streams */ 1475 for (idx = 0; idx < keyfield_count; ++idx) { 1476 if (keyfield[idx].width <= 0) 1477 continue; 1478 /* First get the mask */ 1479 memset(mask, 0, DIV_ROUND_UP(keyfield[idx].width, 8)); 1480 vcap_iter_init(&miter, vctrl->vcaps[vt].sw_width, tgt, 1481 keyfield[idx].offset); 1482 vcap_decode_field(maskstream, &miter, keyfield[idx].width, 1483 mask); 1484 /* Skip if no mask bits are set */ 1485 if (vcap_bitarray_zero(keyfield[idx].width, mask)) 1486 continue; 1487 /* Get the key */ 1488 memset(value, 0, DIV_ROUND_UP(keyfield[idx].width, 8)); 1489 vcap_iter_init(&kiter, vctrl->vcaps[vt].sw_width, tgt, 1490 keyfield[idx].offset); 1491 vcap_decode_field(keystream, &kiter, keyfield[idx].width, 1492 value); 1493 vcap_rule_alloc_keyfield(ri, &keyfield[idx], idx, value, mask); 1494 } 1495 return vcap_set_rule_set_keyset((struct vcap_rule *)ri, keyset); 1496 } 1497 1498 /* Read VCAP content into the VCAP cache */ 1499 static int vcap_read_rule(struct vcap_rule_internal *ri) 1500 { 1501 struct vcap_admin *admin = ri->admin; 1502 int sw_idx, ent_idx = 0, act_idx = 0; 1503 u32 addr = ri->addr; 1504 1505 if (!ri->size || !ri->keyset_sw_regs || !ri->actionset_sw_regs) { 1506 pr_err("%s:%d: rule is empty\n", __func__, __LINE__); 1507 return -EINVAL; 1508 } 1509 vcap_erase_cache(ri); 1510 /* Use the values in the streams to read the VCAP cache */ 1511 for (sw_idx = 0; sw_idx < ri->size; sw_idx++, addr++) { 1512 ri->vctrl->ops->update(ri->ndev, admin, VCAP_CMD_READ, 1513 VCAP_SEL_ALL, addr); 1514 ri->vctrl->ops->cache_read(ri->ndev, admin, 1515 VCAP_SEL_ENTRY, ent_idx, 1516 ri->keyset_sw_regs); 1517 ri->vctrl->ops->cache_read(ri->ndev, admin, 1518 VCAP_SEL_ACTION, act_idx, 1519 ri->actionset_sw_regs); 1520 if (sw_idx == 0) 1521 ri->vctrl->ops->cache_read(ri->ndev, admin, 1522 VCAP_SEL_COUNTER, 1523 ri->counter_id, 0); 1524 ent_idx += ri->keyset_sw_regs; 1525 act_idx += ri->actionset_sw_regs; 1526 } 1527 return 0; 1528 } 1529 1530 /* Write VCAP cache content to the VCAP HW instance */ 1531 static int vcap_write_rule(struct vcap_rule_internal *ri) 1532 { 1533 struct vcap_admin *admin = ri->admin; 1534 int sw_idx, ent_idx = 0, act_idx = 0; 1535 u32 addr = ri->addr; 1536 1537 if (!ri->size || !ri->keyset_sw_regs || !ri->actionset_sw_regs) { 1538 pr_err("%s:%d: rule is empty\n", __func__, __LINE__); 1539 return -EINVAL; 1540 } 1541 /* Use the values in the streams to write the VCAP cache */ 1542 for (sw_idx = 0; sw_idx < ri->size; sw_idx++, addr++) { 1543 ri->vctrl->ops->cache_write(ri->ndev, admin, 1544 VCAP_SEL_ENTRY, ent_idx, 1545 ri->keyset_sw_regs); 1546 ri->vctrl->ops->cache_write(ri->ndev, admin, 1547 VCAP_SEL_ACTION, act_idx, 1548 ri->actionset_sw_regs); 1549 ri->vctrl->ops->update(ri->ndev, admin, VCAP_CMD_WRITE, 1550 VCAP_SEL_ALL, addr); 1551 ent_idx += ri->keyset_sw_regs; 1552 act_idx += ri->actionset_sw_regs; 1553 } 1554 return 0; 1555 } 1556 1557 static int vcap_write_counter(struct vcap_rule_internal *ri, 1558 struct vcap_counter *ctr) 1559 { 1560 struct vcap_admin *admin = ri->admin; 1561 1562 admin->cache.counter = ctr->value; 1563 admin->cache.sticky = ctr->sticky; 1564 ri->vctrl->ops->cache_write(ri->ndev, admin, VCAP_SEL_COUNTER, 1565 ri->counter_id, 0); 1566 ri->vctrl->ops->update(ri->ndev, admin, VCAP_CMD_WRITE, 1567 VCAP_SEL_COUNTER, ri->addr); 1568 return 0; 1569 } 1570 1571 /* Convert a chain id to a VCAP lookup index */ 1572 int vcap_chain_id_to_lookup(struct vcap_admin *admin, int cur_cid) 1573 { 1574 int lookup_first = admin->vinst * admin->lookups_per_instance; 1575 int lookup_last = lookup_first + admin->lookups_per_instance; 1576 int cid_next = admin->first_cid + VCAP_CID_LOOKUP_SIZE; 1577 int cid = admin->first_cid; 1578 int lookup; 1579 1580 for (lookup = lookup_first; lookup < lookup_last; ++lookup, 1581 cid += VCAP_CID_LOOKUP_SIZE, cid_next += VCAP_CID_LOOKUP_SIZE) 1582 if (cur_cid >= cid && cur_cid < cid_next) 1583 return lookup; 1584 return 0; 1585 } 1586 EXPORT_SYMBOL_GPL(vcap_chain_id_to_lookup); 1587 1588 /* Lookup a vcap instance using chain id */ 1589 struct vcap_admin *vcap_find_admin(struct vcap_control *vctrl, int cid) 1590 { 1591 struct vcap_admin *admin; 1592 1593 if (vcap_api_check(vctrl)) 1594 return NULL; 1595 1596 list_for_each_entry(admin, &vctrl->list, list) { 1597 if (cid >= admin->first_cid && cid <= admin->last_cid) 1598 return admin; 1599 } 1600 return NULL; 1601 } 1602 EXPORT_SYMBOL_GPL(vcap_find_admin); 1603 1604 /* Is this the last admin instance ordered by chain id and direction */ 1605 static bool vcap_admin_is_last(struct vcap_control *vctrl, 1606 struct vcap_admin *admin, 1607 bool ingress) 1608 { 1609 struct vcap_admin *iter, *last = NULL; 1610 int max_cid = 0; 1611 1612 list_for_each_entry(iter, &vctrl->list, list) { 1613 if (iter->first_cid > max_cid && 1614 iter->ingress == ingress) { 1615 last = iter; 1616 max_cid = iter->first_cid; 1617 } 1618 } 1619 if (!last) 1620 return false; 1621 1622 return admin == last; 1623 } 1624 1625 /* Calculate the value used for chaining VCAP rules */ 1626 int vcap_chain_offset(struct vcap_control *vctrl, int from_cid, int to_cid) 1627 { 1628 int diff = to_cid - from_cid; 1629 1630 if (diff < 0) /* Wrong direction */ 1631 return diff; 1632 to_cid %= VCAP_CID_LOOKUP_SIZE; 1633 if (to_cid == 0) /* Destination aligned to a lookup == no chaining */ 1634 return 0; 1635 diff %= VCAP_CID_LOOKUP_SIZE; /* Limit to a value within a lookup */ 1636 return diff; 1637 } 1638 EXPORT_SYMBOL_GPL(vcap_chain_offset); 1639 1640 /* Is the next chain id in one of the following lookups 1641 * For now this does not support filters linked to other filters using 1642 * keys and actions. That will be added later. 1643 */ 1644 bool vcap_is_next_lookup(struct vcap_control *vctrl, int src_cid, int dst_cid) 1645 { 1646 struct vcap_admin *admin; 1647 int next_cid; 1648 1649 if (vcap_api_check(vctrl)) 1650 return false; 1651 1652 /* The offset must be at least one lookup, round up */ 1653 next_cid = src_cid + VCAP_CID_LOOKUP_SIZE; 1654 next_cid /= VCAP_CID_LOOKUP_SIZE; 1655 next_cid *= VCAP_CID_LOOKUP_SIZE; 1656 1657 if (dst_cid < next_cid) 1658 return false; 1659 1660 admin = vcap_find_admin(vctrl, dst_cid); 1661 if (!admin) 1662 return false; 1663 1664 return true; 1665 } 1666 EXPORT_SYMBOL_GPL(vcap_is_next_lookup); 1667 1668 /* Check if there is room for a new rule */ 1669 static int vcap_rule_space(struct vcap_admin *admin, int size) 1670 { 1671 if (admin->last_used_addr - size < admin->first_valid_addr) { 1672 pr_err("%s:%d: No room for rule size: %u, %u\n", 1673 __func__, __LINE__, size, admin->first_valid_addr); 1674 return -ENOSPC; 1675 } 1676 return 0; 1677 } 1678 1679 /* Add the keyset typefield to the list of rule keyfields */ 1680 static int vcap_add_type_keyfield(struct vcap_rule *rule) 1681 { 1682 struct vcap_rule_internal *ri = to_intrule(rule); 1683 enum vcap_keyfield_set keyset = rule->keyset; 1684 enum vcap_type vt = ri->admin->vtype; 1685 const struct vcap_field *fields; 1686 const struct vcap_set *kset; 1687 int ret = -EINVAL; 1688 1689 kset = vcap_keyfieldset(ri->vctrl, vt, keyset); 1690 if (!kset) 1691 return ret; 1692 if (kset->type_id == (u8)-1) /* No type field is needed */ 1693 return 0; 1694 1695 fields = vcap_keyfields(ri->vctrl, vt, keyset); 1696 if (!fields) 1697 return -EINVAL; 1698 if (fields[VCAP_KF_TYPE].width > 1) { 1699 ret = vcap_rule_add_key_u32(rule, VCAP_KF_TYPE, 1700 kset->type_id, 0xff); 1701 } else { 1702 if (kset->type_id) 1703 ret = vcap_rule_add_key_bit(rule, VCAP_KF_TYPE, 1704 VCAP_BIT_1); 1705 else 1706 ret = vcap_rule_add_key_bit(rule, VCAP_KF_TYPE, 1707 VCAP_BIT_0); 1708 } 1709 return 0; 1710 } 1711 1712 /* Add the actionset typefield to the list of rule actionfields */ 1713 static int vcap_add_type_actionfield(struct vcap_rule *rule) 1714 { 1715 enum vcap_actionfield_set actionset = rule->actionset; 1716 struct vcap_rule_internal *ri = to_intrule(rule); 1717 enum vcap_type vt = ri->admin->vtype; 1718 const struct vcap_field *fields; 1719 const struct vcap_set *aset; 1720 int ret = -EINVAL; 1721 1722 aset = vcap_actionfieldset(ri->vctrl, vt, actionset); 1723 if (!aset) 1724 return ret; 1725 if (aset->type_id == (u8)-1) /* No type field is needed */ 1726 return 0; 1727 1728 fields = vcap_actionfields(ri->vctrl, vt, actionset); 1729 if (!fields) 1730 return -EINVAL; 1731 if (fields[VCAP_AF_TYPE].width > 1) { 1732 ret = vcap_rule_add_action_u32(rule, VCAP_AF_TYPE, 1733 aset->type_id); 1734 } else { 1735 if (aset->type_id) 1736 ret = vcap_rule_add_action_bit(rule, VCAP_AF_TYPE, 1737 VCAP_BIT_1); 1738 else 1739 ret = vcap_rule_add_action_bit(rule, VCAP_AF_TYPE, 1740 VCAP_BIT_0); 1741 } 1742 return ret; 1743 } 1744 1745 /* Add a keyset to a keyset list */ 1746 bool vcap_keyset_list_add(struct vcap_keyset_list *keysetlist, 1747 enum vcap_keyfield_set keyset) 1748 { 1749 int idx; 1750 1751 if (keysetlist->cnt < keysetlist->max) { 1752 /* Avoid duplicates */ 1753 for (idx = 0; idx < keysetlist->cnt; ++idx) 1754 if (keysetlist->keysets[idx] == keyset) 1755 return keysetlist->cnt < keysetlist->max; 1756 keysetlist->keysets[keysetlist->cnt++] = keyset; 1757 } 1758 return keysetlist->cnt < keysetlist->max; 1759 } 1760 EXPORT_SYMBOL_GPL(vcap_keyset_list_add); 1761 1762 /* Add a actionset to a actionset list */ 1763 static bool vcap_actionset_list_add(struct vcap_actionset_list *actionsetlist, 1764 enum vcap_actionfield_set actionset) 1765 { 1766 int idx; 1767 1768 if (actionsetlist->cnt < actionsetlist->max) { 1769 /* Avoid duplicates */ 1770 for (idx = 0; idx < actionsetlist->cnt; ++idx) 1771 if (actionsetlist->actionsets[idx] == actionset) 1772 return actionsetlist->cnt < actionsetlist->max; 1773 actionsetlist->actionsets[actionsetlist->cnt++] = actionset; 1774 } 1775 return actionsetlist->cnt < actionsetlist->max; 1776 } 1777 1778 /* map keyset id to a string with the keyset name */ 1779 const char *vcap_keyset_name(struct vcap_control *vctrl, 1780 enum vcap_keyfield_set keyset) 1781 { 1782 return vctrl->stats->keyfield_set_names[keyset]; 1783 } 1784 EXPORT_SYMBOL_GPL(vcap_keyset_name); 1785 1786 /* map key field id to a string with the key name */ 1787 const char *vcap_keyfield_name(struct vcap_control *vctrl, 1788 enum vcap_key_field key) 1789 { 1790 return vctrl->stats->keyfield_names[key]; 1791 } 1792 EXPORT_SYMBOL_GPL(vcap_keyfield_name); 1793 1794 /* map actionset id to a string with the actionset name */ 1795 const char *vcap_actionset_name(struct vcap_control *vctrl, 1796 enum vcap_actionfield_set actionset) 1797 { 1798 return vctrl->stats->actionfield_set_names[actionset]; 1799 } 1800 1801 /* map action field id to a string with the action name */ 1802 const char *vcap_actionfield_name(struct vcap_control *vctrl, 1803 enum vcap_action_field action) 1804 { 1805 return vctrl->stats->actionfield_names[action]; 1806 } 1807 1808 /* Return the keyfield that matches a key in a keyset */ 1809 static const struct vcap_field * 1810 vcap_find_keyset_keyfield(struct vcap_control *vctrl, 1811 enum vcap_type vtype, 1812 enum vcap_keyfield_set keyset, 1813 enum vcap_key_field key) 1814 { 1815 const struct vcap_field *fields; 1816 int idx, count; 1817 1818 fields = vcap_keyfields(vctrl, vtype, keyset); 1819 if (!fields) 1820 return NULL; 1821 1822 /* Iterate the keyfields of the keyset */ 1823 count = vcap_keyfield_count(vctrl, vtype, keyset); 1824 for (idx = 0; idx < count; ++idx) { 1825 if (fields[idx].width == 0) 1826 continue; 1827 1828 if (key == idx) 1829 return &fields[idx]; 1830 } 1831 1832 return NULL; 1833 } 1834 1835 /* Match a list of keys against the keysets available in a vcap type */ 1836 static bool _vcap_rule_find_keysets(struct vcap_rule_internal *ri, 1837 struct vcap_keyset_list *matches) 1838 { 1839 const struct vcap_client_keyfield *ckf; 1840 int keyset, found, keycount, map_size; 1841 const struct vcap_field **map; 1842 enum vcap_type vtype; 1843 1844 vtype = ri->admin->vtype; 1845 map = ri->vctrl->vcaps[vtype].keyfield_set_map; 1846 map_size = ri->vctrl->vcaps[vtype].keyfield_set_size; 1847 1848 /* Get a count of the keyfields we want to match */ 1849 keycount = 0; 1850 list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list) 1851 ++keycount; 1852 1853 matches->cnt = 0; 1854 /* Iterate the keysets of the VCAP */ 1855 for (keyset = 0; keyset < map_size; ++keyset) { 1856 if (!map[keyset]) 1857 continue; 1858 1859 /* Iterate the keys in the rule */ 1860 found = 0; 1861 list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list) 1862 if (vcap_find_keyset_keyfield(ri->vctrl, vtype, 1863 keyset, ckf->ctrl.key)) 1864 ++found; 1865 1866 /* Save the keyset if all keyfields were found */ 1867 if (found == keycount) 1868 if (!vcap_keyset_list_add(matches, keyset)) 1869 /* bail out when the quota is filled */ 1870 break; 1871 } 1872 1873 return matches->cnt > 0; 1874 } 1875 1876 /* Match a list of keys against the keysets available in a vcap type */ 1877 bool vcap_rule_find_keysets(struct vcap_rule *rule, 1878 struct vcap_keyset_list *matches) 1879 { 1880 struct vcap_rule_internal *ri = to_intrule(rule); 1881 1882 return _vcap_rule_find_keysets(ri, matches); 1883 } 1884 EXPORT_SYMBOL_GPL(vcap_rule_find_keysets); 1885 1886 /* Return the actionfield that matches a action in a actionset */ 1887 static const struct vcap_field * 1888 vcap_find_actionset_actionfield(struct vcap_control *vctrl, 1889 enum vcap_type vtype, 1890 enum vcap_actionfield_set actionset, 1891 enum vcap_action_field action) 1892 { 1893 const struct vcap_field *fields; 1894 int idx, count; 1895 1896 fields = vcap_actionfields(vctrl, vtype, actionset); 1897 if (!fields) 1898 return NULL; 1899 1900 /* Iterate the actionfields of the actionset */ 1901 count = vcap_actionfield_count(vctrl, vtype, actionset); 1902 for (idx = 0; idx < count; ++idx) { 1903 if (fields[idx].width == 0) 1904 continue; 1905 1906 if (action == idx) 1907 return &fields[idx]; 1908 } 1909 1910 return NULL; 1911 } 1912 1913 /* Match a list of actions against the actionsets available in a vcap type */ 1914 static bool vcap_rule_find_actionsets(struct vcap_rule_internal *ri, 1915 struct vcap_actionset_list *matches) 1916 { 1917 int actionset, found, actioncount, map_size; 1918 const struct vcap_client_actionfield *ckf; 1919 const struct vcap_field **map; 1920 enum vcap_type vtype; 1921 1922 vtype = ri->admin->vtype; 1923 map = ri->vctrl->vcaps[vtype].actionfield_set_map; 1924 map_size = ri->vctrl->vcaps[vtype].actionfield_set_size; 1925 1926 /* Get a count of the actionfields we want to match */ 1927 actioncount = 0; 1928 list_for_each_entry(ckf, &ri->data.actionfields, ctrl.list) 1929 ++actioncount; 1930 1931 matches->cnt = 0; 1932 /* Iterate the actionsets of the VCAP */ 1933 for (actionset = 0; actionset < map_size; ++actionset) { 1934 if (!map[actionset]) 1935 continue; 1936 1937 /* Iterate the actions in the rule */ 1938 found = 0; 1939 list_for_each_entry(ckf, &ri->data.actionfields, ctrl.list) 1940 if (vcap_find_actionset_actionfield(ri->vctrl, vtype, 1941 actionset, 1942 ckf->ctrl.action)) 1943 ++found; 1944 1945 /* Save the actionset if all actionfields were found */ 1946 if (found == actioncount) 1947 if (!vcap_actionset_list_add(matches, actionset)) 1948 /* bail out when the quota is filled */ 1949 break; 1950 } 1951 1952 return matches->cnt > 0; 1953 } 1954 1955 /* Validate a rule with respect to available port keys */ 1956 int vcap_val_rule(struct vcap_rule *rule, u16 l3_proto) 1957 { 1958 struct vcap_rule_internal *ri = to_intrule(rule); 1959 struct vcap_keyset_list matches = {}; 1960 enum vcap_keyfield_set keysets[10]; 1961 int ret; 1962 1963 ret = vcap_api_check(ri->vctrl); 1964 if (ret) 1965 return ret; 1966 if (!ri->admin) { 1967 ri->data.exterr = VCAP_ERR_NO_ADMIN; 1968 return -EINVAL; 1969 } 1970 if (!ri->ndev) { 1971 ri->data.exterr = VCAP_ERR_NO_NETDEV; 1972 return -EINVAL; 1973 } 1974 1975 matches.keysets = keysets; 1976 matches.max = ARRAY_SIZE(keysets); 1977 if (ri->data.keyset == VCAP_KFS_NO_VALUE) { 1978 /* Iterate over rule keyfields and select keysets that fits */ 1979 if (!_vcap_rule_find_keysets(ri, &matches)) { 1980 ri->data.exterr = VCAP_ERR_NO_KEYSET_MATCH; 1981 return -EINVAL; 1982 } 1983 } else { 1984 /* prepare for keyset validation */ 1985 keysets[0] = ri->data.keyset; 1986 matches.cnt = 1; 1987 } 1988 1989 /* Pick a keyset that is supported in the port lookups */ 1990 ret = ri->vctrl->ops->validate_keyset(ri->ndev, ri->admin, rule, 1991 &matches, l3_proto); 1992 if (ret < 0) { 1993 pr_err("%s:%d: keyset validation failed: %d\n", 1994 __func__, __LINE__, ret); 1995 ri->data.exterr = VCAP_ERR_NO_PORT_KEYSET_MATCH; 1996 return ret; 1997 } 1998 /* use the keyset that is supported in the port lookups */ 1999 ret = vcap_set_rule_set_keyset(rule, ret); 2000 if (ret < 0) { 2001 pr_err("%s:%d: keyset was not updated: %d\n", 2002 __func__, __LINE__, ret); 2003 return ret; 2004 } 2005 if (ri->data.actionset == VCAP_AFS_NO_VALUE) { 2006 struct vcap_actionset_list matches = {}; 2007 enum vcap_actionfield_set actionsets[10]; 2008 2009 matches.actionsets = actionsets; 2010 matches.max = ARRAY_SIZE(actionsets); 2011 2012 /* Find an actionset that fits the rule actions */ 2013 if (!vcap_rule_find_actionsets(ri, &matches)) { 2014 ri->data.exterr = VCAP_ERR_NO_ACTIONSET_MATCH; 2015 return -EINVAL; 2016 } 2017 ret = vcap_set_rule_set_actionset(rule, actionsets[0]); 2018 if (ret < 0) { 2019 pr_err("%s:%d: actionset was not updated: %d\n", 2020 __func__, __LINE__, ret); 2021 return ret; 2022 } 2023 } 2024 vcap_add_type_keyfield(rule); 2025 vcap_add_type_actionfield(rule); 2026 /* Add default fields to this rule */ 2027 ri->vctrl->ops->add_default_fields(ri->ndev, ri->admin, rule); 2028 2029 /* Rule size is the maximum of the entry and action subword count */ 2030 ri->size = max(ri->keyset_sw, ri->actionset_sw); 2031 2032 /* Finally check if there is room for the rule in the VCAP */ 2033 return vcap_rule_space(ri->admin, ri->size); 2034 } 2035 EXPORT_SYMBOL_GPL(vcap_val_rule); 2036 2037 /* Entries are sorted with increasing values of sort_key. 2038 * I.e. Lowest numerical sort_key is first in list. 2039 * In order to locate largest keys first in list we negate the key size with 2040 * (max_size - size). 2041 */ 2042 static u32 vcap_sort_key(u32 max_size, u32 size, u8 user, u16 prio) 2043 { 2044 return ((max_size - size) << 24) | (user << 16) | prio; 2045 } 2046 2047 /* calculate the address of the next rule after this (lower address and prio) */ 2048 static u32 vcap_next_rule_addr(u32 addr, struct vcap_rule_internal *ri) 2049 { 2050 return ((addr - ri->size) / ri->size) * ri->size; 2051 } 2052 2053 /* Assign a unique rule id and autogenerate one if id == 0 */ 2054 static u32 vcap_set_rule_id(struct vcap_rule_internal *ri) 2055 { 2056 if (ri->data.id != 0) 2057 return ri->data.id; 2058 2059 for (u32 next_id = 1; next_id < ~0; ++next_id) { 2060 if (!vcap_rule_exists(ri->vctrl, next_id)) { 2061 ri->data.id = next_id; 2062 break; 2063 } 2064 } 2065 return ri->data.id; 2066 } 2067 2068 static int vcap_insert_rule(struct vcap_rule_internal *ri, 2069 struct vcap_rule_move *move) 2070 { 2071 int sw_count = ri->vctrl->vcaps[ri->admin->vtype].sw_count; 2072 struct vcap_rule_internal *duprule, *iter, *elem = NULL; 2073 struct vcap_admin *admin = ri->admin; 2074 u32 addr; 2075 2076 ri->sort_key = vcap_sort_key(sw_count, ri->size, ri->data.user, 2077 ri->data.priority); 2078 2079 /* Insert the new rule in the list of rule based on the sort key 2080 * If the rule needs to be inserted between existing rules then move 2081 * these rules to make room for the new rule and update their start 2082 * address. 2083 */ 2084 list_for_each_entry(iter, &admin->rules, list) { 2085 if (ri->sort_key < iter->sort_key) { 2086 elem = iter; 2087 break; 2088 } 2089 } 2090 2091 if (!elem) { 2092 ri->addr = vcap_next_rule_addr(admin->last_used_addr, ri); 2093 admin->last_used_addr = ri->addr; 2094 2095 /* Add a copy of the rule to the VCAP list */ 2096 duprule = vcap_dup_rule(ri, ri->state == VCAP_RS_DISABLED); 2097 if (IS_ERR(duprule)) 2098 return PTR_ERR(duprule); 2099 2100 list_add_tail(&duprule->list, &admin->rules); 2101 return 0; 2102 } 2103 2104 /* Reuse the space of the current rule */ 2105 addr = elem->addr + elem->size; 2106 ri->addr = vcap_next_rule_addr(addr, ri); 2107 addr = ri->addr; 2108 2109 /* Add a copy of the rule to the VCAP list */ 2110 duprule = vcap_dup_rule(ri, ri->state == VCAP_RS_DISABLED); 2111 if (IS_ERR(duprule)) 2112 return PTR_ERR(duprule); 2113 2114 /* Add before the current entry */ 2115 list_add_tail(&duprule->list, &elem->list); 2116 2117 /* Update the current rule */ 2118 elem->addr = vcap_next_rule_addr(addr, elem); 2119 addr = elem->addr; 2120 2121 /* Update the address in the remaining rules in the list */ 2122 list_for_each_entry_continue(elem, &admin->rules, list) { 2123 elem->addr = vcap_next_rule_addr(addr, elem); 2124 addr = elem->addr; 2125 } 2126 2127 /* Update the move info */ 2128 move->addr = admin->last_used_addr; 2129 move->count = ri->addr - addr; 2130 move->offset = admin->last_used_addr - addr; 2131 admin->last_used_addr = addr; 2132 return 0; 2133 } 2134 2135 static void vcap_move_rules(struct vcap_rule_internal *ri, 2136 struct vcap_rule_move *move) 2137 { 2138 ri->vctrl->ops->move(ri->ndev, ri->admin, move->addr, 2139 move->offset, move->count); 2140 } 2141 2142 /* Check if the chain is already used to enable a VCAP lookup for this port */ 2143 static bool vcap_is_chain_used(struct vcap_control *vctrl, 2144 struct net_device *ndev, int src_cid) 2145 { 2146 struct vcap_enabled_port *eport; 2147 struct vcap_admin *admin; 2148 2149 list_for_each_entry(admin, &vctrl->list, list) 2150 list_for_each_entry(eport, &admin->enabled, list) 2151 if (eport->src_cid == src_cid && eport->ndev == ndev) 2152 return true; 2153 2154 return false; 2155 } 2156 2157 /* Fetch the next chain in the enabled list for the port */ 2158 static int vcap_get_next_chain(struct vcap_control *vctrl, 2159 struct net_device *ndev, 2160 int dst_cid) 2161 { 2162 struct vcap_enabled_port *eport; 2163 struct vcap_admin *admin; 2164 2165 list_for_each_entry(admin, &vctrl->list, list) { 2166 list_for_each_entry(eport, &admin->enabled, list) { 2167 if (eport->ndev != ndev) 2168 continue; 2169 if (eport->src_cid == dst_cid) 2170 return eport->dst_cid; 2171 } 2172 } 2173 2174 return 0; 2175 } 2176 2177 static bool vcap_path_exist(struct vcap_control *vctrl, struct net_device *ndev, 2178 int dst_cid) 2179 { 2180 struct vcap_enabled_port *eport = NULL; 2181 struct vcap_enabled_port *elem; 2182 struct vcap_admin *admin; 2183 int tmp; 2184 2185 if (dst_cid == 0) /* Chain zero is always available */ 2186 return true; 2187 2188 /* Find first entry that starts from chain 0*/ 2189 list_for_each_entry(admin, &vctrl->list, list) { 2190 list_for_each_entry(elem, &admin->enabled, list) { 2191 if (elem->src_cid == 0 && elem->ndev == ndev) { 2192 eport = elem; 2193 break; 2194 } 2195 } 2196 if (eport) 2197 break; 2198 } 2199 2200 if (!eport) 2201 return false; 2202 2203 tmp = eport->dst_cid; 2204 while (tmp != dst_cid && tmp != 0) 2205 tmp = vcap_get_next_chain(vctrl, ndev, tmp); 2206 2207 return !!tmp; 2208 } 2209 2210 /* Internal clients can always store their rules in HW 2211 * External clients can store their rules if the chain is enabled all 2212 * the way from chain 0, otherwise the rule will be cached until 2213 * the chain is enabled. 2214 */ 2215 static void vcap_rule_set_state(struct vcap_rule_internal *ri) 2216 { 2217 if (ri->data.user <= VCAP_USER_QOS) 2218 ri->state = VCAP_RS_PERMANENT; 2219 else if (vcap_path_exist(ri->vctrl, ri->ndev, ri->data.vcap_chain_id)) 2220 ri->state = VCAP_RS_ENABLED; 2221 else 2222 ri->state = VCAP_RS_DISABLED; 2223 } 2224 2225 /* Encode and write a validated rule to the VCAP */ 2226 int vcap_add_rule(struct vcap_rule *rule) 2227 { 2228 struct vcap_rule_internal *ri = to_intrule(rule); 2229 struct vcap_rule_move move = {0}; 2230 struct vcap_counter ctr = {0}; 2231 int ret; 2232 2233 ret = vcap_api_check(ri->vctrl); 2234 if (ret) 2235 return ret; 2236 /* Insert the new rule in the list of vcap rules */ 2237 mutex_lock(&ri->admin->lock); 2238 2239 vcap_rule_set_state(ri); 2240 ret = vcap_insert_rule(ri, &move); 2241 if (ret < 0) { 2242 pr_err("%s:%d: could not insert rule in vcap list: %d\n", 2243 __func__, __LINE__, ret); 2244 goto out; 2245 } 2246 if (move.count > 0) 2247 vcap_move_rules(ri, &move); 2248 2249 if (ri->state == VCAP_RS_DISABLED) { 2250 /* Erase the rule area */ 2251 ri->vctrl->ops->init(ri->ndev, ri->admin, ri->addr, ri->size); 2252 goto out; 2253 } 2254 2255 vcap_erase_cache(ri); 2256 ret = vcap_encode_rule(ri); 2257 if (ret) { 2258 pr_err("%s:%d: rule encoding error: %d\n", __func__, __LINE__, ret); 2259 goto out; 2260 } 2261 2262 ret = vcap_write_rule(ri); 2263 if (ret) { 2264 pr_err("%s:%d: rule write error: %d\n", __func__, __LINE__, ret); 2265 goto out; 2266 } 2267 /* Set the counter to zero */ 2268 ret = vcap_write_counter(ri, &ctr); 2269 out: 2270 mutex_unlock(&ri->admin->lock); 2271 return ret; 2272 } 2273 EXPORT_SYMBOL_GPL(vcap_add_rule); 2274 2275 /* Allocate a new rule with the provided arguments */ 2276 struct vcap_rule *vcap_alloc_rule(struct vcap_control *vctrl, 2277 struct net_device *ndev, int vcap_chain_id, 2278 enum vcap_user user, u16 priority, 2279 u32 id) 2280 { 2281 struct vcap_rule_internal *ri; 2282 struct vcap_admin *admin; 2283 int err, maxsize; 2284 2285 err = vcap_api_check(vctrl); 2286 if (err) 2287 return ERR_PTR(err); 2288 if (!ndev) 2289 return ERR_PTR(-ENODEV); 2290 /* Get the VCAP instance */ 2291 admin = vcap_find_admin(vctrl, vcap_chain_id); 2292 if (!admin) 2293 return ERR_PTR(-ENOENT); 2294 /* Sanity check that this VCAP is supported on this platform */ 2295 if (vctrl->vcaps[admin->vtype].rows == 0) 2296 return ERR_PTR(-EINVAL); 2297 2298 mutex_lock(&admin->lock); 2299 /* Check if a rule with this id already exists */ 2300 if (vcap_rule_exists(vctrl, id)) { 2301 err = -EINVAL; 2302 goto out_unlock; 2303 } 2304 2305 /* Check if there is room for the rule in the block(s) of the VCAP */ 2306 maxsize = vctrl->vcaps[admin->vtype].sw_count; /* worst case rule size */ 2307 if (vcap_rule_space(admin, maxsize)) { 2308 err = -ENOSPC; 2309 goto out_unlock; 2310 } 2311 2312 /* Create a container for the rule and return it */ 2313 ri = kzalloc(sizeof(*ri), GFP_KERNEL); 2314 if (!ri) { 2315 err = -ENOMEM; 2316 goto out_unlock; 2317 } 2318 2319 ri->data.vcap_chain_id = vcap_chain_id; 2320 ri->data.user = user; 2321 ri->data.priority = priority; 2322 ri->data.id = id; 2323 ri->data.keyset = VCAP_KFS_NO_VALUE; 2324 ri->data.actionset = VCAP_AFS_NO_VALUE; 2325 INIT_LIST_HEAD(&ri->list); 2326 INIT_LIST_HEAD(&ri->data.keyfields); 2327 INIT_LIST_HEAD(&ri->data.actionfields); 2328 ri->ndev = ndev; 2329 ri->admin = admin; /* refer to the vcap instance */ 2330 ri->vctrl = vctrl; /* refer to the client */ 2331 2332 if (vcap_set_rule_id(ri) == 0) { 2333 err = -EINVAL; 2334 goto out_free; 2335 } 2336 2337 mutex_unlock(&admin->lock); 2338 return (struct vcap_rule *)ri; 2339 2340 out_free: 2341 kfree(ri); 2342 out_unlock: 2343 mutex_unlock(&admin->lock); 2344 return ERR_PTR(err); 2345 2346 } 2347 EXPORT_SYMBOL_GPL(vcap_alloc_rule); 2348 2349 /* Free mem of a rule owned by client after the rule as been added to the VCAP */ 2350 void vcap_free_rule(struct vcap_rule *rule) 2351 { 2352 struct vcap_rule_internal *ri = to_intrule(rule); 2353 struct vcap_client_actionfield *caf, *next_caf; 2354 struct vcap_client_keyfield *ckf, *next_ckf; 2355 2356 /* Deallocate the list of keys and actions */ 2357 list_for_each_entry_safe(ckf, next_ckf, &ri->data.keyfields, ctrl.list) { 2358 list_del(&ckf->ctrl.list); 2359 kfree(ckf); 2360 } 2361 list_for_each_entry_safe(caf, next_caf, &ri->data.actionfields, ctrl.list) { 2362 list_del(&caf->ctrl.list); 2363 kfree(caf); 2364 } 2365 /* Deallocate the rule */ 2366 kfree(rule); 2367 } 2368 EXPORT_SYMBOL_GPL(vcap_free_rule); 2369 2370 /* Decode a rule from the VCAP cache and return a copy */ 2371 struct vcap_rule *vcap_decode_rule(struct vcap_rule_internal *elem) 2372 { 2373 struct vcap_rule_internal *ri; 2374 int err; 2375 2376 ri = vcap_dup_rule(elem, elem->state == VCAP_RS_DISABLED); 2377 if (IS_ERR(ri)) 2378 return ERR_PTR(PTR_ERR(ri)); 2379 2380 if (ri->state == VCAP_RS_DISABLED) 2381 goto out; 2382 2383 err = vcap_read_rule(ri); 2384 if (err) 2385 return ERR_PTR(err); 2386 2387 err = vcap_decode_keyset(ri); 2388 if (err) 2389 return ERR_PTR(err); 2390 2391 err = vcap_decode_actionset(ri); 2392 if (err) 2393 return ERR_PTR(err); 2394 2395 out: 2396 return &ri->data; 2397 } 2398 2399 struct vcap_rule *vcap_get_rule(struct vcap_control *vctrl, u32 id) 2400 { 2401 struct vcap_rule_internal *elem; 2402 struct vcap_rule *rule; 2403 int err; 2404 2405 err = vcap_api_check(vctrl); 2406 if (err) 2407 return ERR_PTR(err); 2408 2409 elem = vcap_get_locked_rule(vctrl, id); 2410 if (!elem) 2411 return NULL; 2412 2413 rule = vcap_decode_rule(elem); 2414 mutex_unlock(&elem->admin->lock); 2415 return rule; 2416 } 2417 EXPORT_SYMBOL_GPL(vcap_get_rule); 2418 2419 /* Update existing rule */ 2420 int vcap_mod_rule(struct vcap_rule *rule) 2421 { 2422 struct vcap_rule_internal *ri = to_intrule(rule); 2423 struct vcap_counter ctr; 2424 int err; 2425 2426 err = vcap_api_check(ri->vctrl); 2427 if (err) 2428 return err; 2429 2430 if (!vcap_get_locked_rule(ri->vctrl, ri->data.id)) 2431 return -ENOENT; 2432 2433 vcap_rule_set_state(ri); 2434 if (ri->state == VCAP_RS_DISABLED) 2435 goto out; 2436 2437 /* Encode the bitstreams to the VCAP cache */ 2438 vcap_erase_cache(ri); 2439 err = vcap_encode_rule(ri); 2440 if (err) 2441 goto out; 2442 2443 err = vcap_write_rule(ri); 2444 if (err) 2445 goto out; 2446 2447 memset(&ctr, 0, sizeof(ctr)); 2448 err = vcap_write_counter(ri, &ctr); 2449 2450 out: 2451 mutex_unlock(&ri->admin->lock); 2452 return err; 2453 } 2454 EXPORT_SYMBOL_GPL(vcap_mod_rule); 2455 2456 /* Return the alignment offset for a new rule address */ 2457 static int vcap_valid_rule_move(struct vcap_rule_internal *el, int offset) 2458 { 2459 return (el->addr + offset) % el->size; 2460 } 2461 2462 /* Update the rule address with an offset */ 2463 static void vcap_adjust_rule_addr(struct vcap_rule_internal *el, int offset) 2464 { 2465 el->addr += offset; 2466 } 2467 2468 /* Rules needs to be moved to fill the gap of the deleted rule */ 2469 static int vcap_fill_rule_gap(struct vcap_rule_internal *ri) 2470 { 2471 struct vcap_admin *admin = ri->admin; 2472 struct vcap_rule_internal *elem; 2473 struct vcap_rule_move move; 2474 int gap = 0, offset = 0; 2475 2476 /* If the first rule is deleted: Move other rules to the top */ 2477 if (list_is_first(&ri->list, &admin->rules)) 2478 offset = admin->last_valid_addr + 1 - ri->addr - ri->size; 2479 2480 /* Locate gaps between odd size rules and adjust the move */ 2481 elem = ri; 2482 list_for_each_entry_continue(elem, &admin->rules, list) 2483 gap += vcap_valid_rule_move(elem, ri->size); 2484 2485 /* Update the address in the remaining rules in the list */ 2486 elem = ri; 2487 list_for_each_entry_continue(elem, &admin->rules, list) 2488 vcap_adjust_rule_addr(elem, ri->size + gap + offset); 2489 2490 /* Update the move info */ 2491 move.addr = admin->last_used_addr; 2492 move.count = ri->addr - admin->last_used_addr - gap; 2493 move.offset = -(ri->size + gap + offset); 2494 2495 /* Do the actual move operation */ 2496 vcap_move_rules(ri, &move); 2497 2498 return gap + offset; 2499 } 2500 2501 /* Delete rule in a VCAP instance */ 2502 int vcap_del_rule(struct vcap_control *vctrl, struct net_device *ndev, u32 id) 2503 { 2504 struct vcap_rule_internal *ri, *elem; 2505 struct vcap_admin *admin; 2506 int gap = 0, err; 2507 2508 /* This will later also handle rule moving */ 2509 if (!ndev) 2510 return -ENODEV; 2511 err = vcap_api_check(vctrl); 2512 if (err) 2513 return err; 2514 /* Look for the rule id in all vcaps */ 2515 ri = vcap_get_locked_rule(vctrl, id); 2516 if (!ri) 2517 return -ENOENT; 2518 2519 admin = ri->admin; 2520 2521 if (ri->addr > admin->last_used_addr) 2522 gap = vcap_fill_rule_gap(ri); 2523 2524 /* Delete the rule from the list of rules and the cache */ 2525 list_del(&ri->list); 2526 vctrl->ops->init(ndev, admin, admin->last_used_addr, ri->size + gap); 2527 vcap_free_rule(&ri->data); 2528 2529 /* Update the last used address, set to default when no rules */ 2530 if (list_empty(&admin->rules)) { 2531 admin->last_used_addr = admin->last_valid_addr + 1; 2532 } else { 2533 elem = list_last_entry(&admin->rules, struct vcap_rule_internal, 2534 list); 2535 admin->last_used_addr = elem->addr; 2536 } 2537 2538 mutex_unlock(&admin->lock); 2539 return err; 2540 } 2541 EXPORT_SYMBOL_GPL(vcap_del_rule); 2542 2543 /* Delete all rules in the VCAP instance */ 2544 int vcap_del_rules(struct vcap_control *vctrl, struct vcap_admin *admin) 2545 { 2546 struct vcap_enabled_port *eport, *next_eport; 2547 struct vcap_rule_internal *ri, *next_ri; 2548 int ret = vcap_api_check(vctrl); 2549 2550 if (ret) 2551 return ret; 2552 2553 mutex_lock(&admin->lock); 2554 list_for_each_entry_safe(ri, next_ri, &admin->rules, list) { 2555 vctrl->ops->init(ri->ndev, admin, ri->addr, ri->size); 2556 list_del(&ri->list); 2557 vcap_free_rule(&ri->data); 2558 } 2559 admin->last_used_addr = admin->last_valid_addr; 2560 2561 /* Remove list of enabled ports */ 2562 list_for_each_entry_safe(eport, next_eport, &admin->enabled, list) { 2563 list_del(&eport->list); 2564 kfree(eport); 2565 } 2566 mutex_unlock(&admin->lock); 2567 2568 return 0; 2569 } 2570 EXPORT_SYMBOL_GPL(vcap_del_rules); 2571 2572 /* Find a client key field in a rule */ 2573 static struct vcap_client_keyfield * 2574 vcap_find_keyfield(struct vcap_rule *rule, enum vcap_key_field key) 2575 { 2576 struct vcap_rule_internal *ri = to_intrule(rule); 2577 struct vcap_client_keyfield *ckf; 2578 2579 list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list) 2580 if (ckf->ctrl.key == key) 2581 return ckf; 2582 return NULL; 2583 } 2584 2585 /* Find information on a key field in a rule */ 2586 const struct vcap_field *vcap_lookup_keyfield(struct vcap_rule *rule, 2587 enum vcap_key_field key) 2588 { 2589 struct vcap_rule_internal *ri = to_intrule(rule); 2590 enum vcap_keyfield_set keyset = rule->keyset; 2591 enum vcap_type vt = ri->admin->vtype; 2592 const struct vcap_field *fields; 2593 2594 if (keyset == VCAP_KFS_NO_VALUE) 2595 return NULL; 2596 fields = vcap_keyfields(ri->vctrl, vt, keyset); 2597 if (!fields) 2598 return NULL; 2599 return &fields[key]; 2600 } 2601 EXPORT_SYMBOL_GPL(vcap_lookup_keyfield); 2602 2603 /* Check if the keyfield is already in the rule */ 2604 static bool vcap_keyfield_unique(struct vcap_rule *rule, 2605 enum vcap_key_field key) 2606 { 2607 struct vcap_rule_internal *ri = to_intrule(rule); 2608 const struct vcap_client_keyfield *ckf; 2609 2610 list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list) 2611 if (ckf->ctrl.key == key) 2612 return false; 2613 return true; 2614 } 2615 2616 /* Check if the keyfield is in the keyset */ 2617 static bool vcap_keyfield_match_keyset(struct vcap_rule *rule, 2618 enum vcap_key_field key) 2619 { 2620 struct vcap_rule_internal *ri = to_intrule(rule); 2621 enum vcap_keyfield_set keyset = rule->keyset; 2622 enum vcap_type vt = ri->admin->vtype; 2623 const struct vcap_field *fields; 2624 2625 /* the field is accepted if the rule has no keyset yet */ 2626 if (keyset == VCAP_KFS_NO_VALUE) 2627 return true; 2628 fields = vcap_keyfields(ri->vctrl, vt, keyset); 2629 if (!fields) 2630 return false; 2631 /* if there is a width there is a way */ 2632 return fields[key].width > 0; 2633 } 2634 2635 static int vcap_rule_add_key(struct vcap_rule *rule, 2636 enum vcap_key_field key, 2637 enum vcap_field_type ftype, 2638 struct vcap_client_keyfield_data *data) 2639 { 2640 struct vcap_rule_internal *ri = to_intrule(rule); 2641 struct vcap_client_keyfield *field; 2642 2643 if (!vcap_keyfield_unique(rule, key)) { 2644 pr_warn("%s:%d: keyfield %s is already in the rule\n", 2645 __func__, __LINE__, 2646 vcap_keyfield_name(ri->vctrl, key)); 2647 return -EINVAL; 2648 } 2649 2650 if (!vcap_keyfield_match_keyset(rule, key)) { 2651 pr_err("%s:%d: keyfield %s does not belong in the rule keyset\n", 2652 __func__, __LINE__, 2653 vcap_keyfield_name(ri->vctrl, key)); 2654 return -EINVAL; 2655 } 2656 2657 field = kzalloc(sizeof(*field), GFP_KERNEL); 2658 if (!field) 2659 return -ENOMEM; 2660 memcpy(&field->data, data, sizeof(field->data)); 2661 field->ctrl.key = key; 2662 field->ctrl.type = ftype; 2663 list_add_tail(&field->ctrl.list, &rule->keyfields); 2664 return 0; 2665 } 2666 2667 static void vcap_rule_set_key_bitsize(struct vcap_u1_key *u1, enum vcap_bit val) 2668 { 2669 switch (val) { 2670 case VCAP_BIT_0: 2671 u1->value = 0; 2672 u1->mask = 1; 2673 break; 2674 case VCAP_BIT_1: 2675 u1->value = 1; 2676 u1->mask = 1; 2677 break; 2678 case VCAP_BIT_ANY: 2679 u1->value = 0; 2680 u1->mask = 0; 2681 break; 2682 } 2683 } 2684 2685 /* Add a bit key with value and mask to the rule */ 2686 int vcap_rule_add_key_bit(struct vcap_rule *rule, enum vcap_key_field key, 2687 enum vcap_bit val) 2688 { 2689 struct vcap_client_keyfield_data data; 2690 2691 vcap_rule_set_key_bitsize(&data.u1, val); 2692 return vcap_rule_add_key(rule, key, VCAP_FIELD_BIT, &data); 2693 } 2694 EXPORT_SYMBOL_GPL(vcap_rule_add_key_bit); 2695 2696 /* Add a 32 bit key field with value and mask to the rule */ 2697 int vcap_rule_add_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 2698 u32 value, u32 mask) 2699 { 2700 struct vcap_client_keyfield_data data; 2701 2702 data.u32.value = value; 2703 data.u32.mask = mask; 2704 return vcap_rule_add_key(rule, key, VCAP_FIELD_U32, &data); 2705 } 2706 EXPORT_SYMBOL_GPL(vcap_rule_add_key_u32); 2707 2708 /* Add a 48 bit key with value and mask to the rule */ 2709 int vcap_rule_add_key_u48(struct vcap_rule *rule, enum vcap_key_field key, 2710 struct vcap_u48_key *fieldval) 2711 { 2712 struct vcap_client_keyfield_data data; 2713 2714 memcpy(&data.u48, fieldval, sizeof(data.u48)); 2715 return vcap_rule_add_key(rule, key, VCAP_FIELD_U48, &data); 2716 } 2717 EXPORT_SYMBOL_GPL(vcap_rule_add_key_u48); 2718 2719 /* Add a 72 bit key with value and mask to the rule */ 2720 int vcap_rule_add_key_u72(struct vcap_rule *rule, enum vcap_key_field key, 2721 struct vcap_u72_key *fieldval) 2722 { 2723 struct vcap_client_keyfield_data data; 2724 2725 memcpy(&data.u72, fieldval, sizeof(data.u72)); 2726 return vcap_rule_add_key(rule, key, VCAP_FIELD_U72, &data); 2727 } 2728 EXPORT_SYMBOL_GPL(vcap_rule_add_key_u72); 2729 2730 /* Add a 128 bit key with value and mask to the rule */ 2731 int vcap_rule_add_key_u128(struct vcap_rule *rule, enum vcap_key_field key, 2732 struct vcap_u128_key *fieldval) 2733 { 2734 struct vcap_client_keyfield_data data; 2735 2736 memcpy(&data.u128, fieldval, sizeof(data.u128)); 2737 return vcap_rule_add_key(rule, key, VCAP_FIELD_U128, &data); 2738 } 2739 EXPORT_SYMBOL_GPL(vcap_rule_add_key_u128); 2740 2741 int vcap_rule_get_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 2742 u32 *value, u32 *mask) 2743 { 2744 struct vcap_client_keyfield *ckf; 2745 2746 ckf = vcap_find_keyfield(rule, key); 2747 if (!ckf) 2748 return -ENOENT; 2749 2750 *value = ckf->data.u32.value; 2751 *mask = ckf->data.u32.mask; 2752 2753 return 0; 2754 } 2755 EXPORT_SYMBOL_GPL(vcap_rule_get_key_u32); 2756 2757 /* Find a client action field in a rule */ 2758 struct vcap_client_actionfield * 2759 vcap_find_actionfield(struct vcap_rule *rule, enum vcap_action_field act) 2760 { 2761 struct vcap_rule_internal *ri = (struct vcap_rule_internal *)rule; 2762 struct vcap_client_actionfield *caf; 2763 2764 list_for_each_entry(caf, &ri->data.actionfields, ctrl.list) 2765 if (caf->ctrl.action == act) 2766 return caf; 2767 return NULL; 2768 } 2769 EXPORT_SYMBOL_GPL(vcap_find_actionfield); 2770 2771 /* Check if the actionfield is already in the rule */ 2772 static bool vcap_actionfield_unique(struct vcap_rule *rule, 2773 enum vcap_action_field act) 2774 { 2775 struct vcap_rule_internal *ri = to_intrule(rule); 2776 const struct vcap_client_actionfield *caf; 2777 2778 list_for_each_entry(caf, &ri->data.actionfields, ctrl.list) 2779 if (caf->ctrl.action == act) 2780 return false; 2781 return true; 2782 } 2783 2784 /* Check if the actionfield is in the actionset */ 2785 static bool vcap_actionfield_match_actionset(struct vcap_rule *rule, 2786 enum vcap_action_field action) 2787 { 2788 enum vcap_actionfield_set actionset = rule->actionset; 2789 struct vcap_rule_internal *ri = to_intrule(rule); 2790 enum vcap_type vt = ri->admin->vtype; 2791 const struct vcap_field *fields; 2792 2793 /* the field is accepted if the rule has no actionset yet */ 2794 if (actionset == VCAP_AFS_NO_VALUE) 2795 return true; 2796 fields = vcap_actionfields(ri->vctrl, vt, actionset); 2797 if (!fields) 2798 return false; 2799 /* if there is a width there is a way */ 2800 return fields[action].width > 0; 2801 } 2802 2803 static int vcap_rule_add_action(struct vcap_rule *rule, 2804 enum vcap_action_field action, 2805 enum vcap_field_type ftype, 2806 struct vcap_client_actionfield_data *data) 2807 { 2808 struct vcap_rule_internal *ri = to_intrule(rule); 2809 struct vcap_client_actionfield *field; 2810 2811 if (!vcap_actionfield_unique(rule, action)) { 2812 pr_warn("%s:%d: actionfield %s is already in the rule\n", 2813 __func__, __LINE__, 2814 vcap_actionfield_name(ri->vctrl, action)); 2815 return -EINVAL; 2816 } 2817 2818 if (!vcap_actionfield_match_actionset(rule, action)) { 2819 pr_err("%s:%d: actionfield %s does not belong in the rule actionset\n", 2820 __func__, __LINE__, 2821 vcap_actionfield_name(ri->vctrl, action)); 2822 return -EINVAL; 2823 } 2824 2825 field = kzalloc(sizeof(*field), GFP_KERNEL); 2826 if (!field) 2827 return -ENOMEM; 2828 memcpy(&field->data, data, sizeof(field->data)); 2829 field->ctrl.action = action; 2830 field->ctrl.type = ftype; 2831 list_add_tail(&field->ctrl.list, &rule->actionfields); 2832 return 0; 2833 } 2834 2835 static void vcap_rule_set_action_bitsize(struct vcap_u1_action *u1, 2836 enum vcap_bit val) 2837 { 2838 switch (val) { 2839 case VCAP_BIT_0: 2840 u1->value = 0; 2841 break; 2842 case VCAP_BIT_1: 2843 u1->value = 1; 2844 break; 2845 case VCAP_BIT_ANY: 2846 u1->value = 0; 2847 break; 2848 } 2849 } 2850 2851 /* Add a bit action with value to the rule */ 2852 int vcap_rule_add_action_bit(struct vcap_rule *rule, 2853 enum vcap_action_field action, 2854 enum vcap_bit val) 2855 { 2856 struct vcap_client_actionfield_data data; 2857 2858 vcap_rule_set_action_bitsize(&data.u1, val); 2859 return vcap_rule_add_action(rule, action, VCAP_FIELD_BIT, &data); 2860 } 2861 EXPORT_SYMBOL_GPL(vcap_rule_add_action_bit); 2862 2863 /* Add a 32 bit action field with value to the rule */ 2864 int vcap_rule_add_action_u32(struct vcap_rule *rule, 2865 enum vcap_action_field action, 2866 u32 value) 2867 { 2868 struct vcap_client_actionfield_data data; 2869 2870 data.u32.value = value; 2871 return vcap_rule_add_action(rule, action, VCAP_FIELD_U32, &data); 2872 } 2873 EXPORT_SYMBOL_GPL(vcap_rule_add_action_u32); 2874 2875 static int vcap_read_counter(struct vcap_rule_internal *ri, 2876 struct vcap_counter *ctr) 2877 { 2878 struct vcap_admin *admin = ri->admin; 2879 2880 ri->vctrl->ops->update(ri->ndev, admin, VCAP_CMD_READ, VCAP_SEL_COUNTER, 2881 ri->addr); 2882 ri->vctrl->ops->cache_read(ri->ndev, admin, VCAP_SEL_COUNTER, 2883 ri->counter_id, 0); 2884 ctr->value = admin->cache.counter; 2885 ctr->sticky = admin->cache.sticky; 2886 return 0; 2887 } 2888 2889 /* Copy to host byte order */ 2890 void vcap_netbytes_copy(u8 *dst, u8 *src, int count) 2891 { 2892 int idx; 2893 2894 for (idx = 0; idx < count; ++idx, ++dst) 2895 *dst = src[count - idx - 1]; 2896 } 2897 EXPORT_SYMBOL_GPL(vcap_netbytes_copy); 2898 2899 /* Convert validation error code into tc extact error message */ 2900 void vcap_set_tc_exterr(struct flow_cls_offload *fco, struct vcap_rule *vrule) 2901 { 2902 switch (vrule->exterr) { 2903 case VCAP_ERR_NONE: 2904 break; 2905 case VCAP_ERR_NO_ADMIN: 2906 NL_SET_ERR_MSG_MOD(fco->common.extack, 2907 "Missing VCAP instance"); 2908 break; 2909 case VCAP_ERR_NO_NETDEV: 2910 NL_SET_ERR_MSG_MOD(fco->common.extack, 2911 "Missing network interface"); 2912 break; 2913 case VCAP_ERR_NO_KEYSET_MATCH: 2914 NL_SET_ERR_MSG_MOD(fco->common.extack, 2915 "No keyset matched the filter keys"); 2916 break; 2917 case VCAP_ERR_NO_ACTIONSET_MATCH: 2918 NL_SET_ERR_MSG_MOD(fco->common.extack, 2919 "No actionset matched the filter actions"); 2920 break; 2921 case VCAP_ERR_NO_PORT_KEYSET_MATCH: 2922 NL_SET_ERR_MSG_MOD(fco->common.extack, 2923 "No port keyset matched the filter keys"); 2924 break; 2925 } 2926 } 2927 EXPORT_SYMBOL_GPL(vcap_set_tc_exterr); 2928 2929 /* Write a rule to VCAP HW to enable it */ 2930 static int vcap_enable_rule(struct vcap_rule_internal *ri) 2931 { 2932 struct vcap_client_actionfield *af, *naf; 2933 struct vcap_client_keyfield *kf, *nkf; 2934 int err; 2935 2936 vcap_erase_cache(ri); 2937 err = vcap_encode_rule(ri); 2938 if (err) 2939 goto out; 2940 err = vcap_write_rule(ri); 2941 if (err) 2942 goto out; 2943 2944 /* Deallocate the list of keys and actions */ 2945 list_for_each_entry_safe(kf, nkf, &ri->data.keyfields, ctrl.list) { 2946 list_del(&kf->ctrl.list); 2947 kfree(kf); 2948 } 2949 list_for_each_entry_safe(af, naf, &ri->data.actionfields, ctrl.list) { 2950 list_del(&af->ctrl.list); 2951 kfree(af); 2952 } 2953 ri->state = VCAP_RS_ENABLED; 2954 out: 2955 return err; 2956 } 2957 2958 /* Enable all disabled rules for a specific chain/port in the VCAP HW */ 2959 static int vcap_enable_rules(struct vcap_control *vctrl, 2960 struct net_device *ndev, int chain) 2961 { 2962 int next_chain = chain + VCAP_CID_LOOKUP_SIZE; 2963 struct vcap_rule_internal *ri; 2964 struct vcap_admin *admin; 2965 int err = 0; 2966 2967 list_for_each_entry(admin, &vctrl->list, list) { 2968 if (!(chain >= admin->first_cid && chain <= admin->last_cid)) 2969 continue; 2970 2971 /* Found the admin, now find the offloadable rules */ 2972 mutex_lock(&admin->lock); 2973 list_for_each_entry(ri, &admin->rules, list) { 2974 /* Is the rule in the lookup defined by the chain */ 2975 if (!(ri->data.vcap_chain_id >= chain && 2976 ri->data.vcap_chain_id < next_chain)) { 2977 continue; 2978 } 2979 2980 if (ri->ndev != ndev) 2981 continue; 2982 2983 if (ri->state != VCAP_RS_DISABLED) 2984 continue; 2985 2986 err = vcap_enable_rule(ri); 2987 if (err) 2988 break; 2989 } 2990 mutex_unlock(&admin->lock); 2991 if (err) 2992 break; 2993 } 2994 return err; 2995 } 2996 2997 /* Read and erase a rule from VCAP HW to disable it */ 2998 static int vcap_disable_rule(struct vcap_rule_internal *ri) 2999 { 3000 int err; 3001 3002 err = vcap_read_rule(ri); 3003 if (err) 3004 return err; 3005 err = vcap_decode_keyset(ri); 3006 if (err) 3007 return err; 3008 err = vcap_decode_actionset(ri); 3009 if (err) 3010 return err; 3011 3012 ri->state = VCAP_RS_DISABLED; 3013 ri->vctrl->ops->init(ri->ndev, ri->admin, ri->addr, ri->size); 3014 return 0; 3015 } 3016 3017 /* Disable all enabled rules for a specific chain/port in the VCAP HW */ 3018 static int vcap_disable_rules(struct vcap_control *vctrl, 3019 struct net_device *ndev, int chain) 3020 { 3021 struct vcap_rule_internal *ri; 3022 struct vcap_admin *admin; 3023 int err = 0; 3024 3025 list_for_each_entry(admin, &vctrl->list, list) { 3026 if (!(chain >= admin->first_cid && chain <= admin->last_cid)) 3027 continue; 3028 3029 /* Found the admin, now find the rules on the chain */ 3030 mutex_lock(&admin->lock); 3031 list_for_each_entry(ri, &admin->rules, list) { 3032 if (ri->data.vcap_chain_id != chain) 3033 continue; 3034 3035 if (ri->ndev != ndev) 3036 continue; 3037 3038 if (ri->state != VCAP_RS_ENABLED) 3039 continue; 3040 3041 err = vcap_disable_rule(ri); 3042 if (err) 3043 break; 3044 } 3045 mutex_unlock(&admin->lock); 3046 if (err) 3047 break; 3048 } 3049 return err; 3050 } 3051 3052 /* Check if this port is already enabled for this VCAP instance */ 3053 static bool vcap_is_enabled(struct vcap_control *vctrl, struct net_device *ndev, 3054 int dst_cid) 3055 { 3056 struct vcap_enabled_port *eport; 3057 struct vcap_admin *admin; 3058 3059 list_for_each_entry(admin, &vctrl->list, list) 3060 list_for_each_entry(eport, &admin->enabled, list) 3061 if (eport->dst_cid == dst_cid && eport->ndev == ndev) 3062 return true; 3063 3064 return false; 3065 } 3066 3067 /* Enable this port and chain id in a VCAP instance */ 3068 static int vcap_enable(struct vcap_control *vctrl, struct net_device *ndev, 3069 unsigned long cookie, int src_cid, int dst_cid) 3070 { 3071 struct vcap_enabled_port *eport; 3072 struct vcap_admin *admin; 3073 3074 if (src_cid >= dst_cid) 3075 return -EFAULT; 3076 3077 admin = vcap_find_admin(vctrl, dst_cid); 3078 if (!admin) 3079 return -ENOENT; 3080 3081 eport = kzalloc(sizeof(*eport), GFP_KERNEL); 3082 if (!eport) 3083 return -ENOMEM; 3084 3085 eport->ndev = ndev; 3086 eport->cookie = cookie; 3087 eport->src_cid = src_cid; 3088 eport->dst_cid = dst_cid; 3089 mutex_lock(&admin->lock); 3090 list_add_tail(&eport->list, &admin->enabled); 3091 mutex_unlock(&admin->lock); 3092 3093 if (vcap_path_exist(vctrl, ndev, src_cid)) { 3094 /* Enable chained lookups */ 3095 while (dst_cid) { 3096 admin = vcap_find_admin(vctrl, dst_cid); 3097 if (!admin) 3098 return -ENOENT; 3099 3100 vcap_enable_rules(vctrl, ndev, dst_cid); 3101 dst_cid = vcap_get_next_chain(vctrl, ndev, dst_cid); 3102 } 3103 } 3104 return 0; 3105 } 3106 3107 /* Disable this port and chain id for a VCAP instance */ 3108 static int vcap_disable(struct vcap_control *vctrl, struct net_device *ndev, 3109 unsigned long cookie) 3110 { 3111 struct vcap_enabled_port *elem, *eport = NULL; 3112 struct vcap_admin *found = NULL, *admin; 3113 int dst_cid; 3114 3115 list_for_each_entry(admin, &vctrl->list, list) { 3116 list_for_each_entry(elem, &admin->enabled, list) { 3117 if (elem->cookie == cookie && elem->ndev == ndev) { 3118 eport = elem; 3119 found = admin; 3120 break; 3121 } 3122 } 3123 if (eport) 3124 break; 3125 } 3126 3127 if (!eport) 3128 return -ENOENT; 3129 3130 /* Disable chained lookups */ 3131 dst_cid = eport->dst_cid; 3132 while (dst_cid) { 3133 admin = vcap_find_admin(vctrl, dst_cid); 3134 if (!admin) 3135 return -ENOENT; 3136 3137 vcap_disable_rules(vctrl, ndev, dst_cid); 3138 dst_cid = vcap_get_next_chain(vctrl, ndev, dst_cid); 3139 } 3140 3141 mutex_lock(&found->lock); 3142 list_del(&eport->list); 3143 mutex_unlock(&found->lock); 3144 kfree(eport); 3145 return 0; 3146 } 3147 3148 /* Enable/Disable the VCAP instance lookups */ 3149 int vcap_enable_lookups(struct vcap_control *vctrl, struct net_device *ndev, 3150 int src_cid, int dst_cid, unsigned long cookie, 3151 bool enable) 3152 { 3153 int err; 3154 3155 err = vcap_api_check(vctrl); 3156 if (err) 3157 return err; 3158 3159 if (!ndev) 3160 return -ENODEV; 3161 3162 /* Source and destination must be the first chain in a lookup */ 3163 if (src_cid % VCAP_CID_LOOKUP_SIZE) 3164 return -EFAULT; 3165 if (dst_cid % VCAP_CID_LOOKUP_SIZE) 3166 return -EFAULT; 3167 3168 if (enable) { 3169 if (vcap_is_enabled(vctrl, ndev, dst_cid)) 3170 return -EADDRINUSE; 3171 if (vcap_is_chain_used(vctrl, ndev, src_cid)) 3172 return -EADDRNOTAVAIL; 3173 err = vcap_enable(vctrl, ndev, cookie, src_cid, dst_cid); 3174 } else { 3175 err = vcap_disable(vctrl, ndev, cookie); 3176 } 3177 3178 return err; 3179 } 3180 EXPORT_SYMBOL_GPL(vcap_enable_lookups); 3181 3182 /* Is this chain id the last lookup of all VCAPs */ 3183 bool vcap_is_last_chain(struct vcap_control *vctrl, int cid, bool ingress) 3184 { 3185 struct vcap_admin *admin; 3186 int lookup; 3187 3188 if (vcap_api_check(vctrl)) 3189 return false; 3190 3191 admin = vcap_find_admin(vctrl, cid); 3192 if (!admin) 3193 return false; 3194 3195 if (!vcap_admin_is_last(vctrl, admin, ingress)) 3196 return false; 3197 3198 /* This must be the last lookup in this VCAP type */ 3199 lookup = vcap_chain_id_to_lookup(admin, cid); 3200 return lookup == admin->lookups - 1; 3201 } 3202 EXPORT_SYMBOL_GPL(vcap_is_last_chain); 3203 3204 /* Set a rule counter id (for certain vcaps only) */ 3205 void vcap_rule_set_counter_id(struct vcap_rule *rule, u32 counter_id) 3206 { 3207 struct vcap_rule_internal *ri = to_intrule(rule); 3208 3209 ri->counter_id = counter_id; 3210 } 3211 EXPORT_SYMBOL_GPL(vcap_rule_set_counter_id); 3212 3213 int vcap_rule_set_counter(struct vcap_rule *rule, struct vcap_counter *ctr) 3214 { 3215 struct vcap_rule_internal *ri = to_intrule(rule); 3216 int err; 3217 3218 err = vcap_api_check(ri->vctrl); 3219 if (err) 3220 return err; 3221 if (!ctr) { 3222 pr_err("%s:%d: counter is missing\n", __func__, __LINE__); 3223 return -EINVAL; 3224 } 3225 3226 mutex_lock(&ri->admin->lock); 3227 err = vcap_write_counter(ri, ctr); 3228 mutex_unlock(&ri->admin->lock); 3229 3230 return err; 3231 } 3232 EXPORT_SYMBOL_GPL(vcap_rule_set_counter); 3233 3234 int vcap_rule_get_counter(struct vcap_rule *rule, struct vcap_counter *ctr) 3235 { 3236 struct vcap_rule_internal *ri = to_intrule(rule); 3237 int err; 3238 3239 err = vcap_api_check(ri->vctrl); 3240 if (err) 3241 return err; 3242 if (!ctr) { 3243 pr_err("%s:%d: counter is missing\n", __func__, __LINE__); 3244 return -EINVAL; 3245 } 3246 3247 mutex_lock(&ri->admin->lock); 3248 err = vcap_read_counter(ri, ctr); 3249 mutex_unlock(&ri->admin->lock); 3250 3251 return err; 3252 } 3253 EXPORT_SYMBOL_GPL(vcap_rule_get_counter); 3254 3255 /* Get a copy of a client key field */ 3256 static int vcap_rule_get_key(struct vcap_rule *rule, 3257 enum vcap_key_field key, 3258 struct vcap_client_keyfield *ckf) 3259 { 3260 struct vcap_client_keyfield *field; 3261 3262 field = vcap_find_keyfield(rule, key); 3263 if (!field) 3264 return -EINVAL; 3265 memcpy(ckf, field, sizeof(*ckf)); 3266 INIT_LIST_HEAD(&ckf->ctrl.list); 3267 return 0; 3268 } 3269 3270 /* Find a keyset having the same size as the provided rule, where the keyset 3271 * does not have a type id. 3272 */ 3273 static int vcap_rule_get_untyped_keyset(struct vcap_rule_internal *ri, 3274 struct vcap_keyset_list *matches) 3275 { 3276 struct vcap_control *vctrl = ri->vctrl; 3277 enum vcap_type vt = ri->admin->vtype; 3278 const struct vcap_set *keyfield_set; 3279 int idx; 3280 3281 keyfield_set = vctrl->vcaps[vt].keyfield_set; 3282 for (idx = 0; idx < vctrl->vcaps[vt].keyfield_set_size; ++idx) { 3283 if (keyfield_set[idx].sw_per_item == ri->keyset_sw && 3284 keyfield_set[idx].type_id == (u8)-1) { 3285 vcap_keyset_list_add(matches, idx); 3286 return 0; 3287 } 3288 } 3289 return -EINVAL; 3290 } 3291 3292 /* Get the keysets that matches the rule key type/mask */ 3293 int vcap_rule_get_keysets(struct vcap_rule_internal *ri, 3294 struct vcap_keyset_list *matches) 3295 { 3296 struct vcap_control *vctrl = ri->vctrl; 3297 enum vcap_type vt = ri->admin->vtype; 3298 const struct vcap_set *keyfield_set; 3299 struct vcap_client_keyfield kf = {}; 3300 u32 value, mask; 3301 int err, idx; 3302 3303 err = vcap_rule_get_key(&ri->data, VCAP_KF_TYPE, &kf); 3304 if (err) 3305 return vcap_rule_get_untyped_keyset(ri, matches); 3306 3307 if (kf.ctrl.type == VCAP_FIELD_BIT) { 3308 value = kf.data.u1.value; 3309 mask = kf.data.u1.mask; 3310 } else if (kf.ctrl.type == VCAP_FIELD_U32) { 3311 value = kf.data.u32.value; 3312 mask = kf.data.u32.mask; 3313 } else { 3314 return -EINVAL; 3315 } 3316 3317 keyfield_set = vctrl->vcaps[vt].keyfield_set; 3318 for (idx = 0; idx < vctrl->vcaps[vt].keyfield_set_size; ++idx) { 3319 if (keyfield_set[idx].sw_per_item != ri->keyset_sw) 3320 continue; 3321 3322 if (keyfield_set[idx].type_id == (u8)-1) { 3323 vcap_keyset_list_add(matches, idx); 3324 continue; 3325 } 3326 3327 if ((keyfield_set[idx].type_id & mask) == value) 3328 vcap_keyset_list_add(matches, idx); 3329 } 3330 if (matches->cnt > 0) 3331 return 0; 3332 3333 return -EINVAL; 3334 } 3335 3336 /* Collect packet counts from all rules with the same cookie */ 3337 int vcap_get_rule_count_by_cookie(struct vcap_control *vctrl, 3338 struct vcap_counter *ctr, u64 cookie) 3339 { 3340 struct vcap_rule_internal *ri; 3341 struct vcap_counter temp = {}; 3342 struct vcap_admin *admin; 3343 int err; 3344 3345 err = vcap_api_check(vctrl); 3346 if (err) 3347 return err; 3348 3349 /* Iterate all rules in each VCAP instance */ 3350 list_for_each_entry(admin, &vctrl->list, list) { 3351 mutex_lock(&admin->lock); 3352 list_for_each_entry(ri, &admin->rules, list) { 3353 if (ri->data.cookie != cookie) 3354 continue; 3355 3356 err = vcap_read_counter(ri, &temp); 3357 if (err) 3358 goto unlock; 3359 ctr->value += temp.value; 3360 3361 /* Reset the rule counter */ 3362 temp.value = 0; 3363 temp.sticky = 0; 3364 err = vcap_write_counter(ri, &temp); 3365 if (err) 3366 goto unlock; 3367 } 3368 mutex_unlock(&admin->lock); 3369 } 3370 return err; 3371 3372 unlock: 3373 mutex_unlock(&admin->lock); 3374 return err; 3375 } 3376 EXPORT_SYMBOL_GPL(vcap_get_rule_count_by_cookie); 3377 3378 static int vcap_rule_mod_key(struct vcap_rule *rule, 3379 enum vcap_key_field key, 3380 enum vcap_field_type ftype, 3381 struct vcap_client_keyfield_data *data) 3382 { 3383 struct vcap_client_keyfield *field; 3384 3385 field = vcap_find_keyfield(rule, key); 3386 if (!field) 3387 return vcap_rule_add_key(rule, key, ftype, data); 3388 memcpy(&field->data, data, sizeof(field->data)); 3389 return 0; 3390 } 3391 3392 /* Modify a 32 bit key field with value and mask in the rule */ 3393 int vcap_rule_mod_key_u32(struct vcap_rule *rule, enum vcap_key_field key, 3394 u32 value, u32 mask) 3395 { 3396 struct vcap_client_keyfield_data data; 3397 3398 data.u32.value = value; 3399 data.u32.mask = mask; 3400 return vcap_rule_mod_key(rule, key, VCAP_FIELD_U32, &data); 3401 } 3402 EXPORT_SYMBOL_GPL(vcap_rule_mod_key_u32); 3403 3404 static int vcap_rule_mod_action(struct vcap_rule *rule, 3405 enum vcap_action_field action, 3406 enum vcap_field_type ftype, 3407 struct vcap_client_actionfield_data *data) 3408 { 3409 struct vcap_client_actionfield *field; 3410 3411 field = vcap_find_actionfield(rule, action); 3412 if (!field) 3413 return vcap_rule_add_action(rule, action, ftype, data); 3414 memcpy(&field->data, data, sizeof(field->data)); 3415 return 0; 3416 } 3417 3418 /* Modify a 32 bit action field with value in the rule */ 3419 int vcap_rule_mod_action_u32(struct vcap_rule *rule, 3420 enum vcap_action_field action, 3421 u32 value) 3422 { 3423 struct vcap_client_actionfield_data data; 3424 3425 data.u32.value = value; 3426 return vcap_rule_mod_action(rule, action, VCAP_FIELD_U32, &data); 3427 } 3428 EXPORT_SYMBOL_GPL(vcap_rule_mod_action_u32); 3429 3430 /* Drop keys in a keylist and any keys that are not supported by the keyset */ 3431 int vcap_filter_rule_keys(struct vcap_rule *rule, 3432 enum vcap_key_field keylist[], int length, 3433 bool drop_unsupported) 3434 { 3435 struct vcap_rule_internal *ri = to_intrule(rule); 3436 struct vcap_client_keyfield *ckf, *next_ckf; 3437 const struct vcap_field *fields; 3438 enum vcap_key_field key; 3439 int err = 0; 3440 int idx; 3441 3442 if (length > 0) { 3443 err = -EEXIST; 3444 list_for_each_entry_safe(ckf, next_ckf, 3445 &ri->data.keyfields, ctrl.list) { 3446 key = ckf->ctrl.key; 3447 for (idx = 0; idx < length; ++idx) 3448 if (key == keylist[idx]) { 3449 list_del(&ckf->ctrl.list); 3450 kfree(ckf); 3451 idx++; 3452 err = 0; 3453 } 3454 } 3455 } 3456 if (drop_unsupported) { 3457 err = -EEXIST; 3458 fields = vcap_keyfields(ri->vctrl, ri->admin->vtype, 3459 rule->keyset); 3460 if (!fields) 3461 return err; 3462 list_for_each_entry_safe(ckf, next_ckf, 3463 &ri->data.keyfields, ctrl.list) { 3464 key = ckf->ctrl.key; 3465 if (fields[key].width == 0) { 3466 list_del(&ckf->ctrl.list); 3467 kfree(ckf); 3468 err = 0; 3469 } 3470 } 3471 } 3472 return err; 3473 } 3474 EXPORT_SYMBOL_GPL(vcap_filter_rule_keys); 3475 3476 /* Make a full copy of an existing rule with a new rule id */ 3477 struct vcap_rule *vcap_copy_rule(struct vcap_rule *erule) 3478 { 3479 struct vcap_rule_internal *ri = to_intrule(erule); 3480 struct vcap_client_actionfield *caf; 3481 struct vcap_client_keyfield *ckf; 3482 struct vcap_rule *rule; 3483 int err; 3484 3485 err = vcap_api_check(ri->vctrl); 3486 if (err) 3487 return ERR_PTR(err); 3488 3489 rule = vcap_alloc_rule(ri->vctrl, ri->ndev, ri->data.vcap_chain_id, 3490 ri->data.user, ri->data.priority, 0); 3491 if (IS_ERR(rule)) 3492 return rule; 3493 3494 list_for_each_entry(ckf, &ri->data.keyfields, ctrl.list) { 3495 /* Add a key duplicate in the new rule */ 3496 err = vcap_rule_add_key(rule, 3497 ckf->ctrl.key, 3498 ckf->ctrl.type, 3499 &ckf->data); 3500 if (err) 3501 goto err; 3502 } 3503 3504 list_for_each_entry(caf, &ri->data.actionfields, ctrl.list) { 3505 /* Add a action duplicate in the new rule */ 3506 err = vcap_rule_add_action(rule, 3507 caf->ctrl.action, 3508 caf->ctrl.type, 3509 &caf->data); 3510 if (err) 3511 goto err; 3512 } 3513 return rule; 3514 err: 3515 vcap_free_rule(rule); 3516 return ERR_PTR(err); 3517 } 3518 EXPORT_SYMBOL_GPL(vcap_copy_rule); 3519 3520 #ifdef CONFIG_VCAP_KUNIT_TEST 3521 #include "vcap_api_kunit.c" 3522 #endif 3523