monitube-data_packet.c File Reference

Relating to processing packets in the fast path. More...

#include "monitube-data_main.h"
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <sys/jnx/jbuf.h>
#include <jnx/ipc_types.h>
#include <jnx/ipc_msp_pub.h>
#include <jnx/msp_fdb_api.h>
#include <jnx/msp_hw_ts.h>
#include "monitube-data_config.h"
#include "monitube-data_conn.h"
#include "monitube-data_ha.h"
#include "monitube-data_packet.h"
#include "monitube-data_rtp.h"

Go to the source code of this file.

Data Structures

struct  flow_entry_s
struct  hashtable_s

Defines

#define SHARED_MEM_NAME   "monitube-data arena"
 shared mem name
#define FLOW_TABLE_NAME   "monitube flow table"
 table o.c. name
#define FLOW_ENTRY_NAME   "monitube flow entry"
 entry o.c. name
#define FLOW_AGE_CHECK_INTERVAL   15
 run aging routine interval in seconds
#define RETRY_FDB_ATTACH_INTERVAL   3
 retry every 3 seconds for fdb attach
#define MAX_MSP_SEND_RETRIES   100
 Max msp_data_send retries before panic.
#define IP_NEEDED_BYTES   (sizeof(struct ip))
#define UDP_NEEDED_BYTES   (sizeof(struct ip) + sizeof(struct udphdr))
#define MPEG_TS_PACKET_BYTES   (188)
#define MPEG_TS_HEADER_BYTES   (4)
#define FLOW_BUCKET_COUNT   (1024 * 1024)

Typedefs

typedef flow_entry_s flow_entry_t
typedef hashtable_s hashtable_t

Functions

typedef TAILQ_HEAD (ht_bucket_list_s, flow_entry_s)
static void retry_attach_fdb (evContext ctx, void *uap __unused, struct timespec due __unused, struct timespec inter __unused)
static void aging_cleanup (evContext ctx __unused, void *uap __unused, struct timespec due __unused, struct timespec inter __unused)
static void checksum_adjust (unsigned char *chksum, unsigned char *optr, int olen, unsigned char *nptr, int nlen)
static status_t pullup_bytes (struct jbuf **pkt_buf, uint16_t num_bytes)
static void update_stats_for_flow (void *data, uint8_t fragment, flow_entry_t *flow, uint16_t length)
static msp_fdb_iter_res_t set_vrf (msp_fdb_rt_info_t *route_info, void *ctxt)
static status_t process_packet (struct jbuf *pkt_buf, int cpu, uint8_t *mirror, uint32_t *mirror_vrf)
static status_t process_fragment (struct ip *ip_pkt, uint16_t jb_length, uint8_t *mirror, uint32_t *mirror_vrf)
static int send_packet (struct jbuf *pkt_buf, const msp_data_handle_t const *handle)
static void * monitube_process_packet (msp_dataloop_args_t *params)
status_t init_packet_loops (evContext ctx)
void init_forwarding_database (evContext ctx)
void stop_packet_loops (evContext ctx)
void destroy_packet_loops_oc (void)
void clean_flows_with_any_monitor (void)
void clean_flows_with_any_mirror (void)
void clean_flows_with_mirror (in_addr_t addr)
void redirect_flows_with_mirror (in_addr_t addr, in_addr_t to)
void clean_flows_with_monitor (char *name)
void clean_flows_in_monitored_prefix (char *name, in_addr_t prefix, in_addr_t mask)
status_t get_next_flow_state (replication_data_t *last, replication_data_t *next)
status_t add_flow_state (replication_data_t *new_data)
void remove_flow_state (delete_replication_data_t *data)

Variables

const uint32_t HASH_MASK = FLOW_BUCKET_COUNT - 1
 hash_bucket_t
static evTimerID aging_timer
 timer set to do aging and cleanup
static evTimerID retry_timer
 timer set to do fdb attach retry
static msp_shm_handle_t shm_handle
 handle for shared memory allocator
static msp_oc_handle_t table_handle
 handle for OC table allocator
static msp_oc_handle_t entry_handle
 handle for OC table entry allocator
static hashtable_tflows_table
 pointer to the hashtable of flows
static atomic_uint_t loops_running
 # of data loops running
static volatile uint8_t fdb_connected
 T/F depending if attached to FDB.
static volatile uint8_t do_shutdown
 do the data loops need to shutdown
static uint32_t obj_cache_id
 ID for OC memory tracking.
static msp_fdb_handle_t fdb_handle
 handle for FDB (forwarding DB)
volatile boolean is_master
 mastership state of this data component


Detailed Description

Relating to processing packets in the fast path.

These functions and types will manage the packet processing in the data path

Definition in file monitube-data_packet.c.


Define Documentation

#define FLOW_BUCKET_COUNT   (1024 * 1024)

The number of buckets, must be a power of 2, currently 2^20

Definition at line 77 of file monitube-data_packet.c.

Referenced by aging_cleanup(), clean_flows_in_monitored_prefix(), clean_flows_with_any_mirror(), clean_flows_with_any_monitor(), clean_flows_with_mirror(), clean_flows_with_monitor(), get_next_flow_state(), init_packet_loops(), and redirect_flows_with_mirror().

#define IP_NEEDED_BYTES   (sizeof(struct ip))

Must have this many bytes of each packet in the jbuf to analyze it

Definition at line 56 of file monitube-data_packet.c.

Referenced by monitube_process_packet().

#define MPEG_TS_HEADER_BYTES   (4)

This many bytes of each MPEG TS packet are purely header

Definition at line 72 of file monitube-data_packet.c.

Referenced by update_stats_for_flow().

#define MPEG_TS_PACKET_BYTES   (188)

This many (188) bytes total in each MPEG TS packet (188 is standard) DVb-ASI uses 204 bytes. ATSC uses 208 bytes. Adjust accordingly.

Definition at line 67 of file monitube-data_packet.c.

Referenced by update_stats_for_flow().

#define UDP_NEEDED_BYTES   (sizeof(struct ip) + sizeof(struct udphdr))

Must have this many bytes of each packet in the jbuf to analyze it for UDP

Definition at line 61 of file monitube-data_packet.c.

Referenced by monitube_process_packet().


Typedef Documentation

typedef struct flow_entry_s flow_entry_t

flow entry information structure

typedef struct hashtable_s hashtable_t

A hashtable for the flows_table

In hashtable the destination addr is hashed for the KEY to lookup a bucket within the bucket list an input search KEY must match exactly with an existing entry's KEY which is its dest addr + (port or frag_group) We use the destination port for whole IP packets and the frag_group for IP fragments.

The hashtable value is the whole flow entry (in which the key info is also stored).


Function Documentation

status_t add_flow_state ( replication_data_t new_data  ) 

Add flow state to the backup "database" i.e. the flow hashtable. It only gets added if the flow doesn't exist, otherwise it gets merged. This is only called while this data component is a slave and not processing traffic.

Parameters:
[in] new_data The new data to add to the (backup) flow table in this slave component
Returns:
SUCCESS if the flow state information was added; EFAIL, if the OC memory allocation failed.

Definition at line 1750 of file monitube-data_packet.c.

References flow_entry_s::age_ts, replication_data_s::age_ts, flow_entry_s::base_ts, replication_data_s::bucket, flow_entry_s::daddr, replication_data_s::daddr, flow_entry_s::dport, replication_data_s::dport, entry_handle, flows_table, flow_entry_s::frag_group, get_monitored_rate(), hashtable_s::hash_bucket, hash_bucket_t, INSIST_ERR, flow_entry_s::lock, LOG, flow_entry_s::m_vrf, replication_data_s::m_vrf, flow_entry_s::maddr, replication_data_s::maddr, flow_entry_s::mdi_df, flow_entry_s::mdi_mlr, flow_entry_s::mon, replication_data_s::mon, obj_cache_id, flow_entry_s::pl_sum, flow_entry_s::rate, replication_data_s::rate, flow_entry_s::source, replication_data_s::source, flow_entry_s::ssrc, replication_data_s::ssrc, flow_entry_s::vb_max, flow_entry_s::vb_min, flow_entry_s::vb_post, and flow_entry_s::vb_pre.

static void aging_cleanup ( evContext ctx  __unused,
void *uap  __unused,
struct timespec due  __unused,
struct timespec inter  __unused 
) [static]

Callback to periodically age out entries in our flows_table and cleanup shared memory

Parameters:
[in] ctx The event context for this application
[in] uap The user data for this callback
[in] due The absolute time when the event is due (now)
[in] inter The period; when this will next be called

Definition at line 235 of file monitube-data_packet.c.

References flow_entry_s::age_ts, delete_replication_data_s::bucket, current_time, flow_entry_s::daddr, delete_replication_data_s::daddr, flow_entry_s::dport, delete_replication_data_s::dport, entry_handle, FLOW_BUCKET_COUNT, flows_table, get_current_time(), hashtable_s::hash_bucket, hash_bucket_t, INSIST_ERR, flow_entry_s::lock, and obj_cache_id.

Referenced by init_packet_loops().

static void checksum_adjust ( unsigned char *  chksum,
unsigned char *  optr,
int  olen,
unsigned char *  nptr,
int  nlen 
) [static]

This function will adjust a checksum. It is taken directly from the NAT RFC 3022. The algorithm below is applicable only for even offsets (i.e. optr below must be at an even offset from start of header) and even lengths (i.e. olen and nlen below must be even).

Parameters:
[in,out] chksum Checksum
[in] optr Pointer to old data to scan
[in] olen Length of old data to scan
[in] nptr Pointer to old data to scan
[in] nlen Length of new data to scan

Definition at line 316 of file monitube-data_packet.c.

Referenced by process_fragment(), and process_packet().

void clean_flows_in_monitored_prefix ( char *  name,
in_addr_t  prefix,
in_addr_t  mask 
)

Find all flow entries using the given monitor and prefix, and remove them

Parameters:
[in] name The monitor name
[in] prefix The prefix address portion
[in] mask The prefix mask portion

Definition at line 1615 of file monitube-data_packet.c.

References delete_replication_data_s::bucket, flow_entry_s::daddr, delete_replication_data_s::daddr, delete_replication_data_s::dport, flow_entry_s::dport, entry_handle, FLOW_BUCKET_COUNT, flows_table, hashtable_s::hash_bucket, hash_bucket_t, INSIST_ERR, flow_entry_s::lock, flow_entry_s::mon, and obj_cache_id.

Referenced by add_address(), and delete_address().

void clean_flows_with_any_mirror ( void   ) 

Find all flow entries using the a mirror, and remove them

Definition at line 1355 of file monitube-data_packet.c.

References delete_replication_data_s::bucket, delete_replication_data_s::daddr, flow_entry_s::daddr, delete_replication_data_s::dport, flow_entry_s::dport, entry_handle, FLOW_BUCKET_COUNT, flows_table, hashtable_s::hash_bucket, hash_bucket_t, INSIST_ERR, flow_entry_s::lock, flow_entry_s::maddr, and obj_cache_id.

Referenced by clear_mirrors_configuration().

void clean_flows_with_any_monitor ( void   ) 

Find all flow entries using the a monitor, and remove them

Definition at line 1300 of file monitube-data_packet.c.

References delete_replication_data_s::bucket, delete_replication_data_s::daddr, flow_entry_s::daddr, delete_replication_data_s::dport, flow_entry_s::dport, entry_handle, FLOW_BUCKET_COUNT, flows_table, hashtable_s::hash_bucket, hash_bucket_t, INSIST_ERR, flow_entry_s::lock, flow_entry_s::mon, and obj_cache_id.

Referenced by clear_monitors_configuration().

void clean_flows_with_mirror ( in_addr_t  addr  ) 

Find all flow entries using the given mirror, and remove them

Parameters:
[in] addr The mirror from address

Definition at line 1413 of file monitube-data_packet.c.

References delete_replication_data_s::bucket, flow_entry_s::daddr, delete_replication_data_s::daddr, delete_replication_data_s::dport, flow_entry_s::dport, entry_handle, FLOW_BUCKET_COUNT, flows_table, hashtable_s::hash_bucket, hash_bucket_t, INSIST_ERR, flow_entry_s::lock, flow_entry_s::maddr, and obj_cache_id.

Referenced by delete_mirror().

void clean_flows_with_monitor ( char *  name  ) 

Find all flow entries using the given monitor, and remove them

Parameters:
[in] name The monitor name

Definition at line 1550 of file monitube-data_packet.c.

References delete_replication_data_s::bucket, delete_replication_data_s::daddr, flow_entry_s::daddr, delete_replication_data_s::dport, flow_entry_s::dport, entry_handle, FLOW_BUCKET_COUNT, flows_table, hashtable_s::hash_bucket, hash_bucket_t, INSIST_ERR, flow_entry_s::lock, flow_entry_s::mon, and obj_cache_id.

Referenced by delete_monitor(), and update_monitor().

void destroy_packet_loops_oc ( void   ) 

Cleanup shared memory and object caches

Definition at line 1274 of file monitube-data_packet.c.

References entry_handle, flows_table, obj_cache_id, and table_handle.

Referenced by monitube_quit().

status_t get_next_flow_state ( replication_data_t last,
replication_data_t next 
)

Get flow state from the "database" i.e. the flow hashtable. This is be sent to the backup/slave data component. This is only called on the master.

Parameters:
[in] last The last data returned, or NULL if looking for the first entry
[out] next The data to populate
Returns:
SUCCESS if there was more flow state information found after last, which was the previous data returned in next. EFAIL, if no more.

Definition at line 1682 of file monitube-data_packet.c.

References replication_data_s::age_ts, flow_entry_s::age_ts, replication_data_s::bucket, replication_data_s::daddr, flow_entry_s::daddr, replication_data_s::dport, flow_entry_s::dport, FLOW_BUCKET_COUNT, flows_table, hashtable_s::hash_bucket, hash_bucket_t, INSIST_ERR, flow_entry_s::lock, replication_data_s::m_vrf, flow_entry_s::m_vrf, replication_data_s::maddr, flow_entry_s::maddr, MAX_MON_NAME_LEN, replication_data_s::mon, flow_entry_s::mon, replication_data_s::rate, flow_entry_s::rate, replication_data_s::source, flow_entry_s::source, replication_data_s::ssrc, and flow_entry_s::ssrc.

void init_forwarding_database ( evContext  ctx  ) 

Initialize the forwarding database (start trying to attach to it)

Parameters:
[in] ctx event context from master thread used for FDB attach retry timer

Definition at line 1223 of file monitube-data_packet.c.

References LOG, retry_attach_fdb(), RETRY_FDB_ATTACH_INTERVAL, and retry_timer.

Referenced by monitube_init().

status_t init_packet_loops ( evContext  ctx  ) 

Start packet loops, one per available data core

Parameters:
[in] ctx event context from master thread used for cleanup timer

Definition at line 1086 of file monitube-data_packet.c.

References aging_cleanup(), aging_timer, do_shutdown, entry_handle, FLOW_AGE_CHECK_INTERVAL, FLOW_BUCKET_COUNT, FLOW_ENTRY_NAME, FLOW_TABLE_NAME, flows_table, hashtable_s::hash_bucket, LOG, loops_running, monitube_process_packet(), obj_cache_id, SHARED_MEM_NAME, shm_handle, and table_handle.

Referenced by init_application().

static void* monitube_process_packet ( msp_dataloop_args_t *  params  )  [static]

Entry point for packet processing threads (function passed to msp_data_create_loop_on_cpu)

Parameters:
[in] params dataloop parameters with user data, loop identifier, and loop number

Definition at line 964 of file monitube-data_packet.c.

References do_shutdown, INSIST_ERR, IP_NEEDED_BYTES, is_master, LOG, loops_running, process_fragment(), process_packet(), pullup_bytes(), send_packet(), and UDP_NEEDED_BYTES.

Referenced by init_packet_loops().

static status_t process_fragment ( struct ip *  ip_pkt,
uint16_t  jb_length,
uint8_t *  mirror,
uint32_t *  mirror_vrf 
) [static]

Process an IP packet that is UDP, but it is an IP fragment, and not the first. We assume, no UDP header info is available, and a flow must exist for it.

Parameters:
[in] ip_pkt The IP packet
[in] jb_length The length of the received packet
[out] mirror Should the packet be sent out (set to 1) or just monitored (unchanged)
[out] mirror_vrf If mirror is set, then this param will contain the VRF
Returns:
SUCCESS if the packet can be sent out; EFAIL if it can be dropped

Definition at line 818 of file monitube-data_packet.c.

References flow_entry_s::age_ts, checksum_adjust(), flow_entry_s::daddr, flows_table, flow_entry_s::frag_group, get_current_time(), hashtable_s::hash_bucket, hash_bucket_t, HASH_MASK, INSIST_ERR, flow_entry_s::lock, LOG, flow_entry_s::m_vrf, flow_entry_s::maddr, flow_entry_s::rate, and update_stats_for_flow().

Referenced by monitube_process_packet().

static status_t process_packet ( struct jbuf *  pkt_buf,
int  cpu,
uint8_t *  mirror,
uint32_t *  mirror_vrf 
) [static]

Process an IP packet that is UDP, and the UDP header must be available in the bytes following the IP address.

Parameters:
[in] pkt_buf The received jbuf for this packet
[in] length The IP packet length
[in] cpu The current cpu of the caller (used for object cache alloc calls)
[out] mirror Should the packet be sent out (set to 1) or just monitored (unchanged)
[out] mirror_vrf If mirror is set, then this param will contain the VRF
Returns:
SUCCESS if the packet can be sent out; EFAIL if it can be dropped

Definition at line 596 of file monitube-data_packet.c.

References replication_data_s::age_ts, flow_entry_s::age_ts, flow_entry_s::base_ts, replication_data_s::bucket, checksum_adjust(), replication_data_s::daddr, flow_entry_s::daddr, replication_data_s::dport, flow_entry_s::dport, entry_handle, fdb_handle, flows_table, flow_entry_s::frag_group, get_current_time(), get_mirror(), get_monitored_rate(), get_replication_interval(), hashtable_s::hash_bucket, hash_bucket_t, HASH_MASK, INSIST_ERR, flow_entry_s::lock, LOG, replication_data_s::m_vrf, flow_entry_s::m_vrf, replication_data_s::maddr, flow_entry_s::maddr, MAX_MON_NAME_LEN, replication_data_s::mon, flow_entry_s::mon, obj_cache_id, flow_entry_s::pl_sum, pullup_bytes(), flow_entry_s::r_trigger, replication_data_s::rate, flow_entry_s::rate, set_vrf(), replication_data_s::source, flow_entry_s::source, replication_data_s::ssrc, flow_entry_s::ssrc, update_stats_for_flow(), flow_entry_s::vb_max, flow_entry_s::vb_min, flow_entry_s::vb_post, and flow_entry_s::vb_pre.

Referenced by monitube_process_packet().

static status_t pullup_bytes ( struct jbuf **  pkt_buf,
uint16_t  num_bytes 
) [static]

Ensure or pullup enough data into the first jbuf of the chain in order to analyze it better where the bytes are contiguous

Parameters:
[in] pkt_buf The packet in jbuf format (chain of jbufs)
[in] num_bytes The number of contiguous bytes of data required in the first jbuf
Returns:
Returns the result of the jbuf_pullup on the pkt_buf upon SUCCESS; otherwise pkt_buf remains unchanged and EFAIL is returned

Definition at line 360 of file monitube-data_packet.c.

Referenced by monitube_process_packet(), and process_packet().

void redirect_flows_with_mirror ( in_addr_t  addr,
in_addr_t  to 
)

Find all flow entries using the given mirror, and update them

Parameters:
[in] addr The mirror from address
[in] to The new mirror to address

Definition at line 1474 of file monitube-data_packet.c.

References flow_entry_s::age_ts, flow_entry_s::daddr, flow_entry_s::dport, fdb_handle, FLOW_BUCKET_COUNT, flows_table, hashtable_s::hash_bucket, hash_bucket_t, INSIST_ERR, flow_entry_s::lock, LOG, flow_entry_s::m_vrf, flow_entry_s::maddr, MAX_MON_NAME_LEN, flow_entry_s::mon, flow_entry_s::rate, set_vrf(), flow_entry_s::source, and flow_entry_s::ssrc.

Referenced by update_mirror().

void remove_flow_state ( delete_replication_data_t data  ) 

Remove flow state from the backup "database" i.e. the flow hashtable. This is only called while this data component is a slave and not processing traffic.

Parameters:
[in] data The keys to find the flow state to remove

Definition at line 1845 of file monitube-data_packet.c.

References delete_replication_data_s::bucket, flow_entry_s::daddr, delete_replication_data_s::daddr, flow_entry_s::dport, delete_replication_data_s::dport, entry_handle, flows_table, hashtable_s::hash_bucket, hash_bucket_t, INSIST_ERR, flow_entry_s::lock, LOG, and obj_cache_id.

static void retry_attach_fdb ( evContext  ctx,
void *uap  __unused,
struct timespec due  __unused,
struct timespec inter  __unused 
) [static]

Callback to periodically retry attaching to FDB. It stops being called once successfully attached.

Parameters:
[in] ctx The event context for this application
[in] uap The user data for this callback
[in] due The absolute time when the event is due (now)
[in] inter The period; when this will next be called

Definition at line 193 of file monitube-data_packet.c.

References fdb_connected, fdb_handle, init_application(), LOG, and retry_timer.

Referenced by init_forwarding_database().

static int send_packet ( struct jbuf *  pkt_buf,
const msp_data_handle_t const *  handle 
) [static]

Send the packet or other message

Parameters:
[in] pkt_buf The packet in jbuf format as we received it
[in] handle The handle for the data loop
Returns:
Returns the result of the msp_data_send on the packet (MSP_OK upon SUCCESS)

Definition at line 925 of file monitube-data_packet.c.

References LOG, and MAX_MSP_SEND_RETRIES.

Referenced by monitube_process_packet().

static msp_fdb_iter_res_t set_vrf ( msp_fdb_rt_info_t *  route_info,
void *  ctxt 
) [static]

Iterator callback as we search for a VRF

Parameters:
[in] route_info The routing record info retrived from FDB
[in] ctxt The user data passed into the callback msp_fdb_get_all_route_records (this was &flow->m_vrf)
Returns:
the iterator result to stop iterating

Definition at line 563 of file monitube-data_packet.c.

Referenced by process_packet(), and redirect_flows_with_mirror().

void stop_packet_loops ( evContext  ctx  ) 

Cleanup data loops for shutdown

Parameters:
[in] ctx event context from master thread used for cleanup timer

Definition at line 1246 of file monitube-data_packet.c.

References aging_timer, do_shutdown, fdb_connected, fdb_handle, loops_running, and retry_timer.

Referenced by monitube_quit().

typedef TAILQ_HEAD ( ht_bucket_list_s  ,
flow_entry_s   
)

A bucket in a hashtable_t

< lock for this bucket

< list of entries in bucket

Definition at line 129 of file monitube-data_packet.c.

static void update_stats_for_flow ( void *  data,
uint8_t  fragment,
flow_entry_t flow,
uint16_t  length 
) [static]

Calculate MDI stats for this flow

Parameters:
[in] data The payload data (if fragment==FALSE, this is where the RTP header starts) (if fragment==TRUE, no RTP header is assumed to be present)
[in] fragment Is the data from an IP fragmented packet (in a secondary fragment)
[in] flow The locked flow entry
[in] length The length of payload data (under UDP/L4)

Definition at line 395 of file monitube-data_packet.c.

References source_s::base_seq, flow_entry_s::base_ts, rtphdr::cc, source_s::cycles, flow_entry_s::daddr, flow_entry_s::dport, source_s::expected_prior, LOG, source_s::max_seq, flow_entry_s::mdi_df, flow_entry_s::mdi_mlr, MIN_SEQUENTIAL, flow_entry_s::mon, MPEG_TS_HEADER_BYTES, MPEG_TS_PACKET_BYTES, notify_stat_update(), flow_entry_s::pl_sum, source_s::probation, flow_entry_s::rate, source_s::received, source_s::received_prior, RTP_VERSION, rtphdr::seq, flow_entry_s::source, rtphdr::ssrc, flow_entry_s::ssrc, update_seq(), flow_entry_s::vb_max, flow_entry_s::vb_min, flow_entry_s::vb_post, flow_entry_s::vb_pre, and rtphdr::version.

Referenced by process_fragment(), and process_packet().


Variable Documentation

const uint32_t HASH_MASK = FLOW_BUCKET_COUNT - 1

Our mask defining the width of our hash function

Definition at line 82 of file monitube-data_packet.c.

Referenced by process_fragment(), and process_packet().


2007-2009 Juniper Networks, Inc. All rights reserved. The information contained herein is confidential information of Juniper Networks, Inc., and may not be used, disclosed, distributed, modified, or copied without the prior written consent of Juniper Networks, Inc. in an express license. This information is subject to change by Juniper Networks, Inc. Juniper Networks, the Juniper Networks logo, and JUNOS are registered trademarks of Juniper Networks, Inc. in the United States and other countries. All other trademarks, service marks, registered trademarks, or registered service marks are the property of their respective owners.
Generated on Sun May 30 20:27:02 2010 for SDK Your Net Corporation Monitube IPTV Monitoring Example: monitube-data 1.0 by Doxygen 1.5.1