Mercurial > hg > audiostuff
diff spandsp-0.0.6pre17/spandsp-sim/spandsp/g1050.h @ 4:26cd8f1ef0b1
import spandsp-0.0.6pre17
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 15:50:58 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/spandsp-0.0.6pre17/spandsp-sim/spandsp/g1050.h Fri Jun 25 15:50:58 2010 +0200 @@ -0,0 +1,300 @@ +/* + * SpanDSP - a series of DSP components for telephony + * + * g1050.h - IP network modeling, as per G.1050/TIA-921. + * + * Written by Steve Underwood <steveu@coppice.org> + * + * Copyright (C) 2007 Steve Underwood + * + * All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * $Id: g1050.h,v 1.12 2009/06/01 16:27:12 steveu Exp $ + */ + +/*! \file */ + +/*! \page g1050_ip_network_model_page G.1050/TIA-921 IP network path model +\section g1050_ip_network_model_page_sec_1 What does it do? +The ITU G.1050 specification defines a model of an IP network, appropriate +for the testing of how streaming media woud behave across the internet. The +model is based on a path having 5 segments: + - a local LAN (wired or wireless) + - an access link to the internet + - an internet of arbitrary complexity + - an access link from the internet + - a distant LAN (wired or wireless) +The impairments typical of these segments at various service levels are modelled. +8 standard service level behaviours are defined, covering lightly loaded to heavily +congested levels. 168 standard sets of link speeds are defined, covering typical +wired and wireless LAN, broadband access link, and backbone characteristics. + +The G.1050 model is suitable for testing the behaviour of RTP, UDPTL and other streaming +protocols for packet loss and jitter behaviour. +*/ + +#if !defined(_G1050_H_) +#define _G1050_H_ + +/* This is the time slice at which delays, packet loss, etc. are calculated. */ +#define G1050_TICKS_PER_SEC 1000 + +/* Search back 200 ms to preserve order of legitimately out of sequence packets. */ +#define SEARCHBACK_PERIOD 200 + +#define G1050_LOW_LOSS 0 +#define G1050_HIGH_LOSS 1 + +#define G1050_LAN_LINK 1 +#define G1050_ACCESS_LINK 2 + +/*! Segment constants, as defined in G.1050. */ +typedef struct +{ + /*! Probability of changing from low to high and high to low loss states */ + double prob_loss_rate_change[2]; + /*! Probability of an impulse in the low and high loss states */ + double prob_impulse[2][2]; + + /*! Impulse height, based on MTU and bit rate */ + double impulse_height; + /*! Impulse decay coefficient for the single pole IIR filter. */ + double impulse_coeff; + + /*! Probability of packet loss due to occupancy. */ + double prob_packet_loss; + /*! Probability of packet loss due to a multiple access collision. */ + double prob_packet_collision_loss; +} g1050_segment_constants_t; + +/*! End-to-end constants, as defined in G.1050. */ +typedef struct +{ + g1050_segment_constants_t segment[4]; +} g1050_constants_t; + +/*! The model definition for a LAN or access link segment */ +typedef struct +{ + /*! Percentage occupancy of the media */ + double percentage_occupancy; + /*! MTU of the media */ + int mtu; + /*! Maximum jitter in the segment. */ + double max_jitter; +} g1050_segment_model_t; + +/*! The model definition for the core network (backbone) segment */ +typedef struct +{ + /*! Basic delay of the backbone for regional paths */ + double base_regional_delay; + /*! Basic delay of the backbone for intercontinental paths */ + double base_intercontinental_delay; + /*! Percentage packet loss of the backbone */ + /*! Percentage packet loss of the backbone. */ + double percentage_packet_loss; + /*! Maximum jitter in the backbone. */ + double max_jitter; + /*! Interval between the backbone route flapping between two paths, in seconds. */ + double route_flap_interval; + /*! The difference in backbone delay between the two routes we flap between, in seconds. */ + double route_flap_delay; + /*! The interval between link failures. */ + double link_failure_interval; + /*! The duration of link failures. */ + double link_failure_duration; + /*! Probability of packet loss in the backbone. */ + double prob_packet_loss; + /*! Probability of a packet going out of sequence in the backbone. */ + double prob_oos; +} g1050_core_model_t; + +/*! The model definition for a complete end-to-end path */ +typedef struct +{ + /*! The likelyhood of occurance probabilities for the A, B and C scenarios defined in G.1050 */ + int loo[3]; + g1050_segment_model_t sidea_lan; + g1050_segment_model_t sidea_access_link; + g1050_core_model_t core; + g1050_segment_model_t sideb_access_link; + g1050_segment_model_t sideb_lan; +} g1050_model_t; + +/*! The speed model for a complete end-to-end path */ +typedef struct +{ + int sidea_lan_bit_rate; + int sidea_lan_multiple_access; + int sidea_access_link_bit_rate_ab; + int sidea_access_link_bit_rate_ba; + int sidea_access_link_qos_enabled; + int sideb_lan_bit_rate; + int sideb_lan_multiple_access; + int sideb_access_link_bit_rate_ab; + int sideb_access_link_bit_rate_ba; + int sideb_access_link_qos_enabled; + double loo; +} g1050_channel_speeds_t; + +/*! The model state for a LAN or access link segment */ +typedef struct +{ + /*! The type of link, G1050_LAN_LINK or G_1050_ACCESS_LINK */ + int link_type; + /*! 1 if in the high loss state, or 0 if in the low loss state. */ + int high_loss; + + /*! The probability of a loss rate change, for both loss rate states. */ + double prob_loss_rate_change[2]; + /*! The probability of a impulse occuring, for both loss rate states. */ + double prob_impulse[2]; + + /*! The maximum permitted height of impulses. */ + double impulse_height; + /*! The impulse decay coefficient. */ + double impulse_coeff; + + /*! The basic serial delay due to the link. */ + double serial_delay; + /*! Peak jitter in the segment. */ + double max_jitter; + /*! The probability of packet loss. */ + double prob_packet_loss; + /*! The probability of packet loss due to collision. */ + double prob_packet_collision_loss; + /*! The maximum addition delay due to congestion. */ + double congestion_delay; + + /*! TRUE if QoS is enabled on the link. */ + int qos_enabled; + /*! TRUE if the link is a multiple access type (e.g. an ethernet hub). */ + int multiple_access; + + /*! The latest packet arrival time seen on the link. */ + double last_arrival_time; + + /*! 3 seconds of predicted delays for the link */ + double delays[3*G1050_TICKS_PER_SEC]; + + /*! A count of packets lost on the link. */ + uint32_t lost_packets; + /*! An extra debug count of packets lost on the link. */ + uint32_t lost_packets_2; +} g1050_segment_state_t; + +/*! The model state for the core network (backbone) segment */ +typedef struct +{ + /* Router model. */ + int32_t route_flap_counter; + int32_t route_flap_interval; + double route_flap_delta; + + /* Link failure model. */ + int32_t link_failure_counter; + int32_t link_recovery_counter; + + int32_t link_failure_interval_ticks; + int32_t link_failure_duration_ticks; + + /*! Basic backbone delay */ + double base_delay; + /*! Peak jitter in the backbone delay */ + double max_jitter; + /*! Probability of packet loss in the backbone, in percent */ + double prob_packet_loss; + /*! Probability of a packet going out of sequence in the backbone. */ + double prob_oos; + + /*! The latest packet arrival time seen on the link. */ + double last_arrival_time; + double delay_delta; + + /*! 3 seconds of predicted delays for the link */ + double delays[3*G1050_TICKS_PER_SEC]; + + /*! A count of packets lost on the link. */ + uint32_t lost_packets; + /*! An extra debug count of packets lost on the link. */ + uint32_t lost_packets_2; +} g1050_core_state_t; + +/*! The definition of an element in the packet queue */ +typedef struct g1050_queue_element_s +{ + struct g1050_queue_element_s *next; + struct g1050_queue_element_s *prev; + int seq_no; + double departure_time; + double arrival_time; + int len; + uint8_t pkt[]; +} g1050_queue_element_t; + +/*! The model definition for a complete end-to-end path */ +typedef struct +{ + int packet_rate; + int packet_size; + float base_time; + g1050_segment_state_t segment[4]; + g1050_core_state_t core; + double arrival_times_1[3*G1050_TICKS_PER_SEC]; + double arrival_times_2[3*G1050_TICKS_PER_SEC]; + g1050_queue_element_t *first; + g1050_queue_element_t *last; +} g1050_state_t; + +extern g1050_constants_t g1050_constants[1]; +extern g1050_channel_speeds_t g1050_speed_patterns[168]; +extern g1050_model_t g1050_standard_models[9]; + +#ifdef __cplusplus +extern "C" +{ +#endif + +SPAN_DECLARE(g1050_state_t *) g1050_init(int model, + int speed_pattern, + int packet_size, + int packet_rate); + +SPAN_DECLARE(void) g1050_dump_parms(int model, int speed_pattern); + +SPAN_DECLARE(int) g1050_put(g1050_state_t *s, + const uint8_t buf[], + int len, + int seq_no, + double departure_time); + +SPAN_DECLARE(int) g1050_get(g1050_state_t *s, + uint8_t buf[], + int max_len, + double current_time, + int *seq_no, + double *departure_time, + double *arrival_time); + +SPAN_DECLARE(void) g1050_queue_dump(g1050_state_t *s); + +#ifdef __cplusplus +} +#endif + +#endif +/*- End of file ------------------------------------------------------------*/