Changeset 948911d in mainline for uspace/lib/nic/src/nic_rx_control.c


Ignore:
Timestamp:
2012-01-24T02:27:43Z (12 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
230385c
Parents:
8afeb04 (diff), 2df6f6fe (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.
Message:

Mainline changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/nic/src/nic_rx_control.c

    r8afeb04 r948911d  
    4040#include <bool.h>
    4141#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>
    4544#include "nic_rx_control.h"
    4645
     
    392391 *
    393392 * @param rxc
    394  * @param packet        The probed frame
     393 * @param frame     The probed frame
    395394 *
    396395 * @return True if the frame passes, false if it does not
    397396 */
    398 int nic_rxc_check(const nic_rxc_t *rxc, const packet_t *packet,
     397int nic_rxc_check(const nic_rxc_t *rxc, const void *data, size_t size,
    399398        nic_frame_type_t *frame_type)
    400399{
    401400        assert(frame_type != NULL);
    402         uint8_t *dest_addr = (uint8_t *) packet + packet->data_start;
     401        uint8_t *dest_addr = (uint8_t *) data;
    403402        uint8_t *src_addr = dest_addr + ETH_ADDR;
     403
     404        if (size < 2 * ETH_ADDR)
     405                return false;
    404406
    405407        if (dest_addr[0] & 1) {
     
    448450        if (!rxc->vlan_exact && rxc->vlan_mask != NULL) {
    449451                vlan_header_t *vlan_header = (vlan_header_t *)
    450                         ((uint8_t *) packet + packet->data_start + 2 * ETH_ADDR);
     452                        ((uint8_t *) data + 2 * ETH_ADDR);
    451453                if (vlan_header->tpid_upper == VLAN_TPID_UPPER &&
    452454                        vlan_header->tpid_lower == VLAN_TPID_LOWER) {
     
    484486                rxc->vlan_exact = vlan_exact;
    485487}
     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 */
     505static 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
    486527
    487528/**
Note: See TracChangeset for help on using the changeset viewer.