Changeset 3bacee1 in mainline for uspace/lib/nic/src/nic_rx_control.c
- Timestamp:
- 2018-04-12T16:27:17Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3cf22f9
- Parents:
- 76d0981d
- git-author:
- Jiri Svoboda <jiri@…> (2018-04-11 19:25:33)
- git-committer:
- Jiri Svoboda <jiri@…> (2018-04-12 16:27:17)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/nic/src/nic_rx_control.c
r76d0981d r3bacee1 145 145 */ 146 146 void nic_rxc_unicast_get_mode(const nic_rxc_t *rxc, nic_unicast_mode_t *mode, 147 147 size_t max_count, nic_address_t *address_list, size_t *address_count) 148 148 { 149 149 *mode = rxc->unicast_mode; … … 174 174 */ 175 175 errno_t nic_rxc_unicast_set_mode(nic_rxc_t *rxc, nic_unicast_mode_t mode, 176 176 const nic_address_t *address_list, size_t address_count) 177 177 { 178 178 if (mode == NIC_UNICAST_LIST && address_list == NULL) { … … 189 189 for (i = 0; i < address_count; ++i) { 190 190 errno_t rc = nic_addr_db_insert(&rxc->unicast_addrs, 191 191 (const uint8_t *) &address_list[i].address); 192 192 if (rc == ENOMEM) { 193 193 return ENOMEM; … … 208 208 */ 209 209 void nic_rxc_multicast_get_mode(const nic_rxc_t *rxc, 210 211 210 nic_multicast_mode_t *mode, size_t max_count, nic_address_t *address_list, 211 size_t *address_count) 212 212 { 213 213 *mode = rxc->multicast_mode; … … 238 238 */ 239 239 errno_t nic_rxc_multicast_set_mode(nic_rxc_t *rxc, nic_multicast_mode_t mode, 240 240 const nic_address_t *address_list, size_t address_count) 241 241 { 242 242 if (mode == NIC_MULTICAST_LIST && address_list == NULL) … … 252 252 for (i = 0; i < address_count; ++i) { 253 253 errno_t rc = nic_addr_db_insert(&rxc->multicast_addrs, 254 254 (const uint8_t *)&address_list[i].address); 255 255 if (rc == ENOMEM) { 256 256 return ENOMEM; … … 295 295 */ 296 296 void nic_rxc_blocked_sources_get(const nic_rxc_t *rxc, 297 297 size_t max_count, nic_address_t *address_list, size_t *address_count) 298 298 { 299 299 nic_rxc_add_addr_t hs = { … … 321 321 */ 322 322 errno_t nic_rxc_blocked_sources_set(nic_rxc_t *rxc, 323 324 { 325 assert((address_count == 0 && address_list == NULL) 326 ||(address_count != 0 && address_list != NULL));323 const nic_address_t *address_list, size_t address_count) 324 { 325 assert((address_count == 0 && address_list == NULL) || 326 (address_count != 0 && address_list != NULL)); 327 327 328 328 nic_addr_db_clear(&rxc->blocked_sources); … … 331 331 for (i = 0; i < address_count; ++i) { 332 332 errno_t rc = nic_addr_db_insert(&rxc->blocked_sources, 333 333 (const uint8_t *) &address_list[i].address); 334 334 if (rc == ENOMEM) { 335 335 return ENOMEM; … … 395 395 */ 396 396 bool nic_rxc_check(const nic_rxc_t *rxc, const void *data, size_t size, 397 397 nic_frame_type_t *frame_type) 398 398 { 399 399 assert(frame_type != NULL); … … 449 449 if (!rxc->vlan_exact && rxc->vlan_mask != NULL) { 450 450 vlan_header_t *vlan_header = (vlan_header_t *) 451 451 ((uint8_t *) data + 2 * ETH_ADDR); 452 452 if (vlan_header->tpid_upper == VLAN_TPID_UPPER && 453 453 vlan_header->tpid_lower == VLAN_TPID_LOWER) { 454 454 int index = ((int) (vlan_header->vid_upper & 0xF) << 5) | 455 455 (vlan_header->vid_lower >> 3); … … 476 476 */ 477 477 void nic_rxc_hw_filtering(nic_rxc_t *rxc, 478 478 int unicast_exact, int multicast_exact, int vlan_exact) 479 479 { 480 480 if (unicast_exact >= 0) … … 505 505 { 506 506 uint32_t crc; 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 507 int carry, i, j; 508 uint8_t b; 509 510 crc = 0xffffffff; 511 for (i = 0; i < 6; i++) { 512 b = addr[i]; 513 for (j = 0; j < 8; j++) { 514 carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01); 515 crc <<= 1; 516 b >>= 1; 517 if (carry) 518 crc = ((crc ^ CRC_MCAST_POLYNOMIAL) | carry); 519 } 520 } 521 522 uint64_t one64 = 1; 523 return one64 << (crc >> 26); 524 524 } 525 525 … … 571 571 break; 572 572 case NIC_MULTICAST_PROMISC: 573 return ~ 573 return ~(uint64_t) 0; 574 574 } 575 575 uint64_t hash;
Note:
See TracChangeset
for help on using the changeset viewer.