#!/bin/bash


get_rfc2544_base_addr () 
{
   if [ -z ${rfc2544_base_addr+x} ]; 
   then
       rfc2544_base_addr=$(cat /proc/iomem | grep -i rfc2544 | sed 's/-.*$//g') 
   fi
   echo "0x$rfc2544_base_addr";
}



rfc2544_table_modify ()
{
    local field="$1"
    local value="$2"
    local table_id="$3"
    shift 3

    rfc2544_table_dump "$table_id" "$@" | sed "/$field/s/:.*/: $value/" | rfc2544_table_fill "$table_id"
}

rfc2544_table_clear ()
{
    local table_id="$1"
    shift 1

    rfc2544_table_dump "$table_id" "$@" | grep ^0 | rfc2544_table_fill "$table_id"
}


rfc2544_dump_RFC2544_ERROR_COUNTERS ()
{

    echo "CRC (frame/byte) UPD (frame/byte)"

    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_ERROR_COUNTERS_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 4 8 
}

rfc2544_dump_RFC2544_ERROR_COUNTERS_NC ()
{

    echo "CRC (frame/byte) UPD (frame/byte)"

    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_ERROR_COUNTERS_NC_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 4 8 
}

rfc2544_dump_RFC2544_PHY_COUNTERS ()
{
    echo "SFI/XFI RX and TX phy counters - counter CLEARED when read"
    echo "these counters do not work when phy's are in wireline reverse loopback mode (wireline cutthrough mode)"
    echo "Adrs[6:4] = PHY"
    echo "- 0x00 = RX counter (from Triump)"
    echo "- 0x01 = TX counter (To Triumph)"
    echo "- 0x02 = Rx_Classifier search request counter - inc each time rx_parser serarches classifier"
    echo "- 0x03 = Tx_frame_editor output frame counter - inc each time tfe generates a frame"
    echo "- 0x04 = Dropped Frame Counters"
    echo "- 0x05 = Classifier to Tx Frame Editor Request counter"
    echo "- 0x06 = Classifier to Rx Frame Processor Request counter"
    echo "- 0x07 = Short frame counter"
    echo "Adrs[3] = Counter type"
    echo "- 0 = Frame counter"
    echo "- 1 = Byte Counter" 

    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_PHY_COUNTERS_REGS  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 16 8 
}


rfc2544_dump_RFC2544_PHY_COUNTERS_NC ()
{
    echo "SFI/XFI RX and TX phy counters - counter CLEARED when read"
    echo "these counters do not work when phy's are in wireline reverse loopback mode (wireline cutthrough mode)"
    echo "Adrs[6:4] = PHY"
    echo "- 0x00 = RX counter (from Triump)"
    echo "- 0x01 = TX counter (To Triumph)"
    echo "- 0x02 = Rx_Classifier search request counter - inc each time rx_parser serarches classifier"
    echo "- 0x03 = Tx_frame_editor output frame counter - inc each time tfe generates a frame"
    echo "- 0x04 = Dropped Frame Counters"
    echo "- 0x05 = Classifier to Tx Frame Editor Request counter"
    echo "- 0x06 = Classifier to Rx Frame Processor Request counter"
    echo "- 0x07 = Short frame counter"
    echo "Adrs[3] = Counter type"
    echo "- 0 = Frame counter"
    echo "- 1 = Byte Counter" 

    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_PHY_COUNTERS_NC_REGS  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 16 8 
}



rfc2544_dump_RFC2544_TMR_BLK16 ()
{
    if [ "$#" -ne 1 ]
    then
    echo "Usage: <serviceId>"
    return  
    fi

    local id="$1"
    shift 1


    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_TMR_BLK16_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id * 32)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 32 
}


rfc2544_dump_RFC2544_IDT ()
{

    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_IDT_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 512 4 
}

rfc2544_dump_RFC2544_EMIX_PATTERNS ()
{

    if [ "$#" -ne 1 ]
    then
    echo "Usage: <64 sets of EMIX patterns (0-63)>"
    return  
    fi

    local id="$1"
    shift 1


    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_EMIX_PATTERNS_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id * 64)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 16 4 
}


rfc2544_dump_RFC2544_SEQUENCE_TX_SEQ_NUM()
{

    if [ "$#" -ne 1 ]
    then
    echo "Usage: <serviceId>"
    return  
    fi

    local id="$1"
    shift 1


    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_SEQUENCE_TX_SEQ_NUM | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id * 4)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 1 4 
}


rfc2544_dump_RFC2544_TMR_BLK128 ()
{
    if [ "$#" -ne 1 ]
    then
    echo "Usage: <serviceId>"
    return  
    fi

    local id="$1"
    shift 1


    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_TMR_BLK128_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id * 32)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 32 
}


rfc2544_dump_RFC2544_RX_FRAME_COUNTERS ()
{
    if [ "$#" -ne 1 ]
    then
    echo "Usage: <serviceId>"
    return  
    fi

    local id="$1"
    shift 1

    echo "Adrs[6:3] = Frame type"
    echo "- 4'h0 = Unknown Frame type"
    echo "- 4'h1 = UDP Frame"
    echo "- 4'h2 = DMM Frame"
    echo "- 4'h3 = DMR Frame"
    echo "- 4'h4 = LBM Frame"
    echo "- 4'h5 = LBR Frame"
    echo "- 4'h6 = IPV4 Frame"
    echo "- 4'h7-8 = unused"
    echo "- 4'h9 = Y1731 Test Frame"
    echo "- 4'ha = Non-IP Frame"
    echo "- 4'hb = IPV6 UDP Frame"
    echo "- 4'hc = IPV6 Non-UDP Frame"
    echo "- 4'hd-F = unused"

    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_RX_FRAME_COUNTERS_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id << 7)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 16 8  
}

rfc2544_dump_RFC2544_RX_FRAME_COUNTERS_NC ()
{
    if [ "$#" -ne 1 ]
    then
    echo "Usage: <serviceId>"
    return  
    fi

    local id="$1"
    shift 1

    echo "Adrs[6:3] = Frame type"
    echo "- 4'h0 = Unknown Frame type"
    echo "- 4'h1 = UDP Frame"
    echo "- 4'h2 = DMM Frame"
    echo "- 4'h3 = DMR Frame"
    echo "- 4'h4 = LBM Frame"
    echo "- 4'h5 = LBR Frame"
    echo "- 4'h6 = IPV4 Frame"
    echo "- 4'h7-8 = unused"
    echo "- 4'h9 = Y1731 Test Frame"
    echo "- 4'ha = Non-IP Frame"
    echo "- 4'hb = IPV6 UDP Frame"
    echo "- 4'hc = IPV6 Non-UDP Frame"
    echo "- 4'hd-F = unused"


    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_RX_FRAME_COUNTERS_NC_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id << 7)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 16 8  
}


rfc2544_dump_RFC2544_TMR_BLK1024 ()
{
    if [ "$#" -ne 1 ]
    then
    echo "Usage: <serviceId>"
    return  
    fi

    local id="$1"
    shift 1


    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_TMR_BLK1024_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id * 32)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 32 
}


rfc2544_dump_RFC2544_COUNTERS ()
{
    if [ "$#" -ne 1 ]
    then
    echo "Usage: <serviceId>"
    return  
    fi

    local id="$1"
    shift 1

    echo "Rx(frame/byte) Tx(frame/byte)"

    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_COUNTERS_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id << 5)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 4 8  
}

rfc2544_dump_RFC2544_COUNTERS_NC ()
{
    if [ "$#" -ne 1 ]
    then
    echo "Usage: <serviceId>"
    return  
    fi

    local id="$1"
    shift 1

    echo "Rx(frame/byte) Tx(frame/byte)"

    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_COUNTERS_NC_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id << 5)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 4 8  
}


rfc2544_dump_RFC2544_GEN_RAM()
{
    if [ "$#" -ne 1 ]
    then
    echo "Usage: <serviceId>"
    return  
    fi

    local id="$1"
    shift 1


    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_GEN_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id * 128)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 128  
}


rfc2544_dump_RFC2544_RX_STATS ()
{
    if [ "$#" -ne 1 ]
    then
    echo "Usage: <serviceId>"
    return  
    fi

    local id="$1"
    shift 1


    local base=$(get_rfc2544_base_addr)
    local regA=0x$(rfc2544reg RFC2544_RX_STATS_RAM  | sed 's/ .*$//g' | sed 's/^0*//')
    local addr=$(($base+$regA + ($id * 256)))

    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 24 8  
}















