Ignore:
File:
1 edited

Legend:

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

    rcf9cb36 r00d7e1b  
    4040#include <bool.h>
    4141#include <errno.h>
    42 #include <mem.h>
    43 #include <nic/nic.h>
     42#include <net/device.h>
     43#include <net_checksum.h>
     44#include <packet_client.h>
    4445#include "nic_rx_control.h"
    4546
     
    391392 *
    392393 * @param rxc
    393  * @param frame     The probed frame
     394 * @param packet        The probed frame
    394395 *
    395396 * @return True if the frame passes, false if it does not
    396397 */
    397 int nic_rxc_check(const nic_rxc_t *rxc, const void *data, size_t size,
     398int nic_rxc_check(const nic_rxc_t *rxc, const packet_t *packet,
    398399        nic_frame_type_t *frame_type)
    399400{
    400401        assert(frame_type != NULL);
    401         uint8_t *dest_addr = (uint8_t *) data;
     402        uint8_t *dest_addr = (uint8_t *) packet + packet->data_start;
    402403        uint8_t *src_addr = dest_addr + ETH_ADDR;
    403 
    404         if (size < 2 * ETH_ADDR)
    405                 return false;
    406404
    407405        if (dest_addr[0] & 1) {
     
    440438                }
    441439        }
    442        
    443440        /* Blocked source addresses */
    444441        if (rxc->block_sources) {
     
    446443                        return false;
    447444        }
    448        
    449445        /* VLAN filtering */
    450446        if (!rxc->vlan_exact && rxc->vlan_mask != NULL) {
    451447                vlan_header_t *vlan_header = (vlan_header_t *)
    452                         ((uint8_t *) data + 2 * ETH_ADDR);
     448                        ((uint8_t *) packet + packet->data_start + 2 * ETH_ADDR);
    453449                if (vlan_header->tpid_upper == VLAN_TPID_UPPER &&
    454450                        vlan_header->tpid_lower == VLAN_TPID_LOWER) {
     
    486482                rxc->vlan_exact = vlan_exact;
    487483}
    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 
    527484
    528485/**
Note: See TracChangeset for help on using the changeset viewer.