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