Logo Search packages:      
Sourcecode: nmap version File versions  Download package

tme.h

/*
 * Copyright (c) 2001 - 2003
 * NetGroup, Politecnico di Torino (Italy)
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the Politecnico di Torino nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef __tme_include_
#define __tme_include_

#ifdef WIN_NT_DRIVER
#include "ndis.h"
#else
#include <windows.h>
#endif /*WIN_NT_DRIVER*/

#include "memory_t.h"
#include "time_calls.h"


/* error codes */
#define           TME_ERROR               0     
#define           TME_SUCCESS             1
#define           TME_TRUE                2
#define           TME_FALSE               3

/* some constants */
#define           DEFAULT_MEM_EX_SIZE           65536
#define           MAX_TME_DATA_BLOCKS           4
#define           TME_NONE_ACTIVE               0xffffffff
#define           DELTA_READ                    2  /* secs */

#define           TME_LUT_ENTRIES                           0x00000000  
#define           TME_MAX_FILL_STATE                        0x00000001  /*potrebbe servire per un thread a passive level!?!?! */
#define           TME_REHASHING_VALUE                       0x00000002  
#define           TME_KEY_LEN                               0x00000003
#define           TME_SHARED_MEMORY_BLOCKS            0x00000004
#define           TME_FILLED_ENTRIES                        0x00000005
#define           TME_BLOCK_SIZE                            0x00000006
#define           TME_EXTRA_SEGMENT_SIZE              0x00000007
#define           TME_LOOKUP_CODE                           0x00000008
#define           TME_OUT_LUT_EXEC                    0x00000009
#define           TME_FILLED_BLOCKS                   0x0000000a
#define           TME_DEFAULT_EXEC                    0x0000000b
#define           TME_LUT_BASE_ADDRESS                0x0000000c
#define           TME_SHARED_MEMORY_BASE_ADDRESS      0x0000000d
#define           TME_EXTRA_SEGMENT_BASE_ADDRESS      0x0000000e
#define           TME_LAST_FOUND                            0x0000000f   /* contains the offset of the last found entry */
#define           TME_LAST_FOUND_BLOCK                0x00000010
/* TME default values */
#define           TME_LUT_ENTRIES_DEFAULT                   32007
#define           TME_REHASHING_VALUE_DEFAULT               1
#define           TME_SHARED_MEMORY_BLOCKS_DEFAULT    16000
#define           TME_BLOCK_SIZE_DEFAULT                    64
#define           TME_EXTRA_SEGMENT_SIZE_DEFAULT            0
#define           TME_LOOKUP_CODE_DEFAULT                   0
#define           TME_OUT_LUT_EXEC_DEFAULT                  0
#define           TME_DEFAULT_EXEC_DEFAULT                  0
#define           TME_MAX_FILL_STATE_DEFAULT                15000

#define IS_VALIDATED(src,index) (src&(1<<index))

#define VALIDATE(src,index) src|=(1<<index);


#define FORCE_NO_DELETION(timestamp)  (struct timeval*)(timestamp)->tv_sec=0x7fffffff;

/* TME callback prototypes */
typedef uint32 (*lut_fcn)(uint8 *key, struct __TME_DATA *data,MEM_TYPE *mem_ex, struct time_conv *time_ref );
typedef uint32 (*exec_fcn)(uint8 *block, uint32 pkt_size, struct __TME_DATA *data, MEM_TYPE *mem_ex, uint8 *mem_data);

/* DO NOT MODIFY THIS STRUCTURE!!!! GV */
typedef struct __RECORD

{
      uint32 block;
      uint32 exec_fcn;
}
      RECORD, *PRECORD;

/* TME data registers */
struct __TME_DATA
{
      uint32 lut_entries;
      uint32 max_fill_state;
      uint32 rehashing_value;
      uint32 key_len;
      uint32 shared_memory_blocks;
      uint32 filled_entries;
      uint32 block_size;
      uint32 extra_segment_size;
      uint32 filled_blocks;
      lut_fcn lookup_code;
      uint32 default_exec;
      uint32 out_lut_exec;
      uint8 *lut_base_address;
      uint8 *shared_memory_base_address;
      uint8 *extra_segment_base_address;
      struct timeval last_read;
      uint32      enable_deletion;
      uint8 *last_found;
};

typedef struct __TME_DATA TME_DATA,*PTME_DATA;



/* TME core */
typedef struct __TME_CORE
{
      uint32      working;
      uint32            active;
      uint32            validated_blocks;
      TME_DATA    block_data[MAX_TME_DATA_BLOCKS];
      uint32            active_read;
      
} TME_CORE, *PTME_CORE;

static __inline int32 IS_DELETABLE(void *timestamp, TME_DATA *data)
{
      struct timeval *ts=(struct timeval*)timestamp;

      if (data->enable_deletion==FALSE)
            return FALSE;
      if (data->filled_entries<data->max_fill_state)
            return FALSE;
      if ((ts->tv_sec+DELTA_READ)<data->last_read.tv_sec)
            return TRUE;
      return FALSE;
}

/* functions to manage TME */
uint32 init_tme_block(TME_CORE *tme, uint32 block);
uint32 validate_tme_block(MEM_TYPE *mem_ex, TME_CORE *tme, uint32 block, uint32 mem_ex_offset);
uint32 lookup_frontend(MEM_TYPE *mem_ex, TME_CORE *tme,uint32 mem_ex_offset, struct time_conv *time_ref);
uint32 execute_frontend(MEM_TYPE *mem_ex, TME_CORE *tme, uint32 pkt_size,uint32 offset);
uint32 set_active_tme_block(TME_CORE *tme, uint32 block);
uint32 init_extended_memory(uint32 size, MEM_TYPE *mem_ex);
uint32 reset_tme(TME_CORE *tme);
uint32 get_tme_block_register(TME_DATA *data,MEM_TYPE *mem_ex,uint32 rgstr,uint32 *rval);
uint32 set_tme_block_register(TME_DATA *data,MEM_TYPE *mem_ex,uint32 rgstr,uint32 value, int32 init);
uint32 set_active_read_tme_block(TME_CORE *tme, uint32 block);
uint32 set_autodeletion(TME_DATA *data, uint32 value);

/* function mappers */
lut_fcn lut_fcn_mapper(uint32 index);
exec_fcn exec_fcn_mapper(uint32 index);

#endif

Generated by  Doxygen 1.6.0   Back to index