//Editor-Info: -*- C++ -*-
//
//Subject: TOVE project / testing/pducoder
//
//File: bisupframecoding.cpp
//
//Version: $Revision: 1.15 $
//
//State: $State: Exp $
//
//Date: $Date: 1998/12/22 14:43:20 $
//
//Organisation:
//      Helsinki University of Technology
//      Laboratory of Telecommunications Software and Multimedia
//
//Author:
//      Timo Kokkonen
//      Sami Raatikainen
//
//Description:
//      See corresponding header file.
//
//Copyright:
//      Copyright 1999 Helsinki University of Technology
//      ALL RIGHTS RESERVED BETWEEN JANUARY 1996 AND JUNE 1999.
//
//Licence:
//
//
//History:
//

#include "pf/bytes.h"
#include "bisupframecoding.h"

void makeBisupPDUheader(pfUlong pduType_, pfFrame &frame_)
{
    // PDUcompatibilityInf
    frame_.putFirst(B1000_0000);
    // PDU length
    frame_.putFirst16bit(frame_.length());
    // PDU type
    frame_.putFirst(pduType_);
    return;
}

// Constructing different frames
void makeTestPDU(pfFrame &frame_)
{
    makeAALParameters_IE(frame_);
    makeCause_IE(frame_);
    makeCI_IE(frame_);
    makeDSID_IE(frame_);
    makeTNS_IE(frame_);
    makeATMCellRate_IE(frame_);
    makeBBC_IE(frame_);
    makeBisupPDUheader(B1111_1111, frame_);
    return;
}

void makeIAM(pfFrame &frame_)
{
    makeOSID_IE(frame_);
    makeATMCellRate_IE(frame_);
    makeBBC_IE(frame_);
    makeBisupPDUheader(B0000_0001, frame_);
    return;
}

void makeIAA(pfFrame &frame_)
{
    makeCI_IE(frame_);
    makeDSID_IE(frame_);
    makeBisupPDUheader(B0000_1010, frame_);
    return;
}

void makeIAR(pfFrame &frame_)
{
    makeOSID_IE(frame_);
    makeDSID_IE(frame_);
    makeCause_IE(frame_);
    makeBisupPDUheader(B0000_1011, frame_);
    return;
}

void makeANM(pfFrame &frame_)
{
    makeDSID_IE(frame_);
    makeBisupPDUheader(B0000_1001, frame_);
    return;
}

void makeREL(pfFrame &frame_)
{
    makeCause_IE(frame_);
    makeDSID_IE(frame_);
    makeBisupPDUheader(B0000_1100, frame_);
    return;
}

void makeRLC(pfFrame &frame_)
{
    makeCause_IE(frame_);
    makeDSID_IE(frame_);
    makeBisupPDUheader(B0001_0000, frame_);
    return;
}



//----------------------------------------------------------------------

void makeAALParameters_IE(pfFrame &frame_)
{
   frame_.putFirst(B0000_1111);
   frame_.putFirst(B1000_1011); // partially filled...
   frame_.putFirst16bit(9);
   frame_.putFirst(B1000_1011); // block size id
   frame_.putFirst(B0000_1111);
   frame_.putFirst(B1000_1001); // error correction
   frame_.putFirst(B0000_1111);
   frame_.putFirst(B1000_1000); // source clock
   frame_.putFirst16bit(9);
   frame_.putFirst(B1000_0111); // multiplier
   frame_.putFirst(B0000_1111);
   frame_.putFirst(B1000_0110); // CBR rate 
   frame_.putFirst(B0000_1111);
   frame_.putFirst(B1000_0101); // Subtype

    frame_.putFirst(B0000_0001); // AAL type = 1
    // compatibility
    frame_.putFirst(B1000_0000); // X80
    frame_.putFirst(B0000_0000); // X00
    // length
    frame_.putFirst16bit(19);
    // IE type
    frame_.putFirst(B0100_0111);
    return;
}

void makeATMCellRate_IE(pfFrame &frame_)
{
    // Backward peak cell rate, CLP = 1
    frame_.putFirst24bit(12);
    frame_.putFirst(B1000_0101);
    // Forward peak cell rate, CLP = 1
    frame_.putFirst24bit(12);
    frame_.putFirst(B1000_0100);
    // Backward peak cell rate, CLP = 0
    frame_.putFirst24bit(12);
    frame_.putFirst(B1000_0011);
    // Forward peak cell rate, CLP = 0
    frame_.putFirst24bit(12);
    frame_.putFirst(B1000_0010);
    
    // compatibility
    frame_.putFirst(B1000_0000); // X80
    frame_.putFirst(B0000_0000); // X00
    // length
    frame_.putFirst16bit(18);     // 
    // IE type
    frame_.putFirst(B0000_1000); // x08
    
    return;
}

void makeBBC_IE(pfFrame &frame_)
{
    frame_.putFirst(B1000_0000);
    frame_.putFirst(B1000_0000);
    frame_.putFirst(B0001_0000); // BCOB-X

    frame_.putFirst(B1000_0000); // Q.2763/7.10 (Coding Standard)

    // compatibility
    frame_.putFirst(B1000_0000); // X80
    frame_.putFirst(B0000_0000); // X00
    // length
    frame_.putFirst16bit(6);
    // IE type
    frame_.putFirst(B0101_0000); // x50
    return;   
}


void makeCI_IE(pfFrame &frame_) // Connection identifier
{
    // VCI
    frame_.putFirst16bit(130);   // X00 82
    // VPCI
    frame_.putFirst16bit(248);   // X00 F8
    // compatibility
    frame_.putFirst(B1000_0000); // X80
    frame_.putFirst(B0000_0000); // X00
    // length
    frame_.putFirst16bit(6);     // X00 06
    // IE type
    frame_.putFirst(B0000_0110); // X06

    return;
}

void makeCause_IE(pfFrame &frame_)
{
    // ext. bit, cause value (7 bits)
    frame_.putFirst(B1010_1101); // xBD cause value 45
    // ext. bit, coding standard (2 bits), spare, location(4 bits)
    frame_.putFirst(B1000_0000); // x80
    // compatibility
    frame_.putFirst(B1000_0000); // x80
    frame_.putFirst(B0000_0000); // x00
    // length
    frame_.putFirst16bit(4);     // x00 06
    // IE type
    frame_.putFirst(B0001_0010); // x12
    return;
}

void makeDSID_IE(pfFrame &frame_)
{
    // Control ID
    frame_.putFirst(B1111_1110); // XFE
    frame_.putFirst(B0000_0001); // X01
    frame_.putFirst(B0000_0000); // X00
    frame_.putFirst(B0000_0000); // X00
    // compatibility
    frame_.putFirst(B1000_0000); // X80
    frame_.putFirst(B0000_0000); // X00
    // length
    frame_.putFirst16bit(6);     // X00 06
    // IE type
    frame_.putFirst(B0000_0011); // X03

    return;
}

void makeOSID_IE(pfFrame &frame_)
{
    // Control ID
    frame_.putFirst(B1111_1110); // XFE
    frame_.putFirst(B0000_0001); // X01
    frame_.putFirst(B0000_0000); // X00
    frame_.putFirst(B0000_0000); // X00
    // compatibility
    frame_.putFirst(B1000_0000); // X80
    frame_.putFirst(B0000_0000); // X00
    // length
    frame_.putFirst16bit(6);     // X00 06
    // IE type
    frame_.putFirst(B0000_0010); // X02

    return;
}

void makeTNS_IE(pfFrame &frame_)
{
    // Network identification
    frame_.putFirst(B0000_0001); // x01
    frame_.putFirst(B1110_1111); // xEF
    frame_.putFirst(B1100_1101); // xCD
    frame_.putFirst(B1010_1011); // xAB
    frame_.putFirst(B1000_1001); // x89
    frame_.putFirst(B0110_0111); // x67
    frame_.putFirst(B0100_0101); // x45
    frame_.putFirst(B0010_0011); // x23
    frame_.putFirst(B0000_0001); // x01

    // even/odd + type of network id + network id plan
    frame_.putFirst(B1010_0000); // xA0
    // compatibility
    frame_.putFirst(B1000_0000); // x80
    frame_.putFirst(B0000_0000); // x00
    // length
    frame_.putFirst16bit(12);     // x00 0C
    // IE type
    frame_.putFirst(B0010_0011); // x23

    return;
}

