Source to ./atm.h
/*
* Cisco router simulation platform.
* Copyright (c) 2005,2006 Christophe Fillot ([email protected])
*
* ATM definitions.
*/
#ifndef __ATM_H__
#define __ATM_H__
#include <pthread.h>
#include "utils.h"
#include "mempool.h"
#include "net_io.h"
/* ATM payload size */
#define ATM_HDR_SIZE 5
#define ATM_PAYLOAD_SIZE 48
#define ATM_CELL_SIZE (ATM_HDR_SIZE + ATM_PAYLOAD_SIZE)
#define ATM_AAL5_TRAILER_SIZE 8
#define ATM_AAL5_TRAILER_POS (ATM_CELL_SIZE - ATM_AAL5_TRAILER_SIZE)
/* ATM header structure */
#define ATM_HDR_VPI_MASK 0xFFF00000
#define ATM_HDR_VPI_SHIFT 20
#define ATM_HDR_VCI_MASK 0x000FFFF0
#define ATM_HDR_VCI_SHIFT 4
#define ATM_HDR_PTI_MASK 0x0000000E
#define ATM_HDR_PTI_SHIFT 1
/* PTI bits */
#define ATM_PTI_EOP 0x00000002 /* End of packet */
#define ATM_PTI_CONGESTION 0x00000004 /* Congestion detected */
#define ATM_PTI_NETWORK 0x00000008 /* Network traffic */
/* VP-level switch table */
typedef struct atmsw_vp_conn atmsw_vp_conn_t;
struct atmsw_vp_conn {
atmsw_vp_conn_t *next;
netio_desc_t *input,*output;
u_int vpi_in,vpi_out;
m_uint64_t cell_cnt;
};
/* VC-level switch table */
typedef struct atmsw_vc_conn atmsw_vc_conn_t;
struct atmsw_vc_conn {
atmsw_vc_conn_t *next;
netio_desc_t *input,*output;
u_int vpi_in,vci_in;
u_int vpi_out,vci_out;
m_uint64_t cell_cnt;
};
/* Virtual ATM switch table */
#define ATMSW_NIO_MAX 32
#define ATMSW_VP_HASH_SIZE 256
#define ATMSW_VC_HASH_SIZE 1024
typedef struct atmsw_table atmsw_table_t;
struct atmsw_table {
char *name;
pthread_mutex_t lock;
mempool_t mp;
m_uint64_t cell_drop;
atmsw_vp_conn_t *vp_table[ATMSW_VP_HASH_SIZE];
atmsw_vc_conn_t *vc_table[ATMSW_VC_HASH_SIZE];
};
#define ATMSW_LOCK(t) pthread_mutex_lock(&(t)->lock)
#define ATMSW_UNLOCK(t) pthread_mutex_unlock(&(t)->lock)
/* RFC1483 bridged mode header */
#define ATM_RFC1483B_HLEN 10
extern m_uint8_t atm_rfc1483b_header[ATM_RFC1483B_HLEN];
/* Compute HEC field for ATM header */
m_uint8_t atm_compute_hec(m_uint8_t *cell_header);
/* Insert HEC field into an ATM header */
void atm_insert_hec(m_uint8_t *cell_header);
/* Update the CRC on the data block one byte at a time */
m_uint32_t atm_update_crc(m_uint32_t crc_accum,m_uint8_t *ptr,int len);
/* Initialize ATM code (for HEC checksums) */
void atm_init(void);
/* Acquire a reference to an ATM switch (increment reference count) */
atmsw_table_t *atmsw_acquire(char *name);
/* Release an ATM switch (decrement reference count) */
int atmsw_release(char *name);
/* Create a virtual switch table */
atmsw_table_t *atmsw_create_table(char *name);
/* Create a VP switch connection */
int atmsw_create_vpc(atmsw_table_t *t,char *nio_input,u_int vpi_in,
char *nio_output,u_int vpi_out);
/* Delete a VP switch connection */
int atmsw_delete_vpc(atmsw_table_t *t,char *nio_input,u_int vpi_in,
char *nio_output,u_int vpi_out);
/* Create a VC switch connection */
int atmsw_create_vcc(atmsw_table_t *t,
char *input,u_int vpi_in,u_int vci_in,
char *output,u_int vpi_out,u_int vci_out);
/* Delete a VC switch connection */
int atmsw_delete_vcc(atmsw_table_t *t,
char *nio_input,u_int vpi_in,u_int vci_in,
char *nio_output,u_int vpi_out,u_int vci_out);
/* Save the configuration of an ATM switch */
void atmsw_save_config(atmsw_table_t *t,FILE *fd);
/* Save configurations of all ATM switches */
void atmsw_save_config_all(FILE *fd);
/* Delete an ATM switch */
int atmsw_delete(char *name);
/* Delete all ATM switches */
int atmsw_delete_all(void);
/* Start a virtual ATM switch */
int atmsw_start(char *filename);
#endif