Changeset 6843a9c in mainline for uspace/lib/nic/src/nic_rx_control.c
- Timestamp:
- 2012-06-29T13:02:14Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 722912e
- Parents:
- ba72f2b (diff), 0bbd13e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/nic/src/nic_rx_control.c
rba72f2b r6843a9c 40 40 #include <bool.h> 41 41 #include <errno.h> 42 #include <net/device.h> 43 #include <net_checksum.h> 44 #include <packet_client.h> 42 #include <mem.h> 43 #include <nic/nic.h> 45 44 #include "nic_rx_control.h" 46 45 … … 392 391 * 393 392 * @param rxc 394 * @param packetThe probed frame393 * @param frame The probed frame 395 394 * 396 395 * @return True if the frame passes, false if it does not 397 396 */ 398 int nic_rxc_check(const nic_rxc_t *rxc, const packet_t *packet,397 int nic_rxc_check(const nic_rxc_t *rxc, const void *data, size_t size, 399 398 nic_frame_type_t *frame_type) 400 399 { 401 400 assert(frame_type != NULL); 402 uint8_t *dest_addr = (uint8_t *) packet + packet->data_start;401 uint8_t *dest_addr = (uint8_t *) data; 403 402 uint8_t *src_addr = dest_addr + ETH_ADDR; 403 404 if (size < 2 * ETH_ADDR) 405 return false; 404 406 405 407 if (dest_addr[0] & 1) { … … 438 440 } 439 441 } 442 440 443 /* Blocked source addresses */ 441 444 if (rxc->block_sources) { … … 443 446 return false; 444 447 } 448 445 449 /* VLAN filtering */ 446 450 if (!rxc->vlan_exact && rxc->vlan_mask != NULL) { 447 451 vlan_header_t *vlan_header = (vlan_header_t *) 448 ((uint8_t *) packet + packet->data_start+ 2 * ETH_ADDR);452 ((uint8_t *) data + 2 * ETH_ADDR); 449 453 if (vlan_header->tpid_upper == VLAN_TPID_UPPER && 450 454 vlan_header->tpid_lower == VLAN_TPID_LOWER) { … … 482 486 rxc->vlan_exact = vlan_exact; 483 487 } 488 489 /** Polynomial used in multicast address hashing */ 490 #define CRC_MCAST_POLYNOMIAL 0x04c11db6 491 492 /** Compute the standard hash from MAC 493 * 494 * Hashing MAC into 64 possible values and using the value as index to 495 * 64bit number. 496 * 497 * The code is copied from qemu-0.13's implementation of ne2000 and rt8139 498 * drivers, but according to documentation there it originates in FreeBSD. 499 * 500 * @param[in] addr The 6-byte MAC address to be hashed 501 * 502 * @return 64-bit number with only single bit set to 1 503 * 504 */ 505 static uint64_t multicast_hash(const uint8_t addr[6]) 506 { 507 uint32_t crc; 508 int carry, i, j; 509 uint8_t b; 510 511 crc = 0xffffffff; 512 for (i = 0; i < 6; i++) { 513 b = addr[i]; 514 for (j = 0; j < 8; j++) { 515 carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01); 516 crc <<= 1; 517 b >>= 1; 518 if (carry) 519 crc = ((crc ^ CRC_MCAST_POLYNOMIAL) | carry); 520 } 521 } 522 523 uint64_t one64 = 1; 524 return one64 << (crc >> 26); 525 } 526 484 527 485 528 /**
Note:
See TracChangeset
for help on using the changeset viewer.