{******************************************************************************}
{                                                                              }
{ Winsock2 RSVP/LPM API interface Unit for Object Pascal                       }
{                                                                              }
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
{ Corporation. All Rights Reserved.                                            }
{                                                                              }
{ The original file is: lpmapi.h, released June 2000. The original Pascal      }
{ code is: LpmApi.pas, released December 2000. The initial developer of the    }
{ Pascal code is Marcel van Brakel (brakelm att chello dott nl).               }
{                                                                              }
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
{ Marcel van Brakel. All Rights Reserved.                                      }
{                                                                              }
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
{                                                                              }
{ You may retrieve the latest version of this file at the Project JEDI         }
{ APILIB home page, located at http://jedi-apilib.sourceforge.net              }
{                                                                              }
{ The contents of this file are used with permission, subject to the Mozilla   }
{ Public License Version 1.1 (the "License"); you may not use this file except }
{ in compliance with the License. You may obtain a copy of the License at      }
{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
{                                                                              }
{ Software distributed under the License is distributed on an "AS IS" basis,   }
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
{ the specific language governing rights and limitations under the License.    }
{                                                                              }
{ Alternatively, the contents of this file may be used under the terms of the  }
{ GNU Lesser General Public License (the  "LGPL License"), in which case the   }
{ provisions of the LGPL License are applicable instead of those above.        }
{ If you wish to allow use of your version of this file only under the terms   }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting  the provisions above and  }
{ replace  them with the notice and other provisions required by the LGPL      }
{ License.  If you do not delete the provisions above, a recipient may use     }
{ your version of this file under either the MPL or the LGPL License.          }
{                                                                              }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{                                                                              }
{******************************************************************************}


unit JwaLpmApi;

{$WEAKPACKAGEUNIT}

{$HPPEMIT ''}
{$HPPEMIT '#include "lpmapi.h"'}
{$HPPEMIT ''}

{$I jediapilib.inc}

interface

uses
  JwaWinSock2, JwaWinType;

type
  FLOAT = Single;
  {$NODEFINE FLOAT}

(****************************************************************************

            RSVPD -- ReSerVation Protocol Daemon

                USC Information Sciences Institute
                Marina del Rey, California

        Original Version: Shai Herzog, Nov. 1993.
        Current Version:  Steven Berson & Bob Braden, may 1996.

  Copyright (c) 1996 by the University of Southern California
  All rights reserved.

  Permission to use, copy, modify, and distribute this software and its
  documentation in source and binary forms for any purpose and without
  fee is hereby granted, provided that both the above copyright notice
  and this permission notice appear in all copies, and that any
  documentation, advertising materials, and other materials related to
  such distribution and use acknowledge that the software was developed
  in part by the University of Southern California, Information
  Sciences Institute.  The name of the University may not be used to
  endorse or promote products derived from this software without
  specific prior written permission.

  THE UNIVERSITY OF SOUTHERN CALIFORNIA makes no representations about
  the suitability of this software for any purpose.  THIS SOFTWARE IS
  PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
  INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

  Other copyrights might apply to parts of this software and are so
  noted when applicable.

********************************************************************)

(*
 *  Standard format of an RSVP object header
 *)

type
  RsvpObjHdr = record
    obj_length: USHORT; (* Length in bytes *)
    obj_class: UCHAR;   (* Class (values defined below) *)
    obj_ctype: UCHAR;   (* C-Type (values defined below) *)
  end;
  {$EXTERNALSYM RsvpObjHdr}
  TRsvpObjHdr = RsvpObjHdr;
  PRsvpObjHdr = ^RsvpObjHdr;
  PPRsvpObjHdr = ^PRsvpObjHdr;

function ObjLength(const x: TRsvpObjHdr): USHORT;
{$EXTERNALSYM ObjLength}
function ObjCType(const x: TRsvpObjHdr): UCHAR;
{$EXTERNALSYM ObjCType}
function ObjClass(const x: TRsvpObjHdr): UCHAR;
{$EXTERNALSYM ObjClass}
function ObjData(const x: TRsvpObjHdr): Pointer;
{$EXTERNALSYM ObjData}

(*
 *  Define object classes: Class-Num values
 *)

const
  class_NULL            = 0;
  {$EXTERNALSYM class_NULL}
  class_SESSION         = 1;
  {$EXTERNALSYM class_SESSION}
  class_SESSION_GROUP   = 2;
  {$EXTERNALSYM class_SESSION_GROUP}
  class_RSVP_HOP        = 3;
  {$EXTERNALSYM class_RSVP_HOP}
  class_INTEGRITY       = 4;
  {$EXTERNALSYM class_INTEGRITY}
  class_TIME_VALUES     = 5;
  {$EXTERNALSYM class_TIME_VALUES}
  class_ERROR_SPEC      = 6;
  {$EXTERNALSYM class_ERROR_SPEC}
  class_SCOPE           = 7;
  {$EXTERNALSYM class_SCOPE}
  class_STYLE           = 8;
  {$EXTERNALSYM class_STYLE}
  class_FLOWSPEC        = 9; // these two are the same
  {$EXTERNALSYM class_FLOWSPEC}
  class_IS_FLOWSPEC     = 9; // since we added IS in front of the name
  {$EXTERNALSYM class_IS_FLOWSPEC}
  class_FILTER_SPEC     = 10;
  {$EXTERNALSYM class_FILTER_SPEC}
  class_SENDER_TEMPLATE = 11;
  {$EXTERNALSYM class_SENDER_TEMPLATE}
  class_SENDER_TSPEC    = 12;
  {$EXTERNALSYM class_SENDER_TSPEC}
  class_ADSPEC          = 13;
  {$EXTERNALSYM class_ADSPEC}
  class_POLICY_DATA     = 14;
  {$EXTERNALSYM class_POLICY_DATA}
  class_CONFIRM         = 15;
  {$EXTERNALSYM class_CONFIRM}
  class_MAX             = 15;
  {$EXTERNALSYM class_MAX}

(*
 *  RSVP SESSION object
 *)

  ctype_SESSION_ipv4    = 1;
  {$EXTERNALSYM ctype_SESSION_ipv4}
  ctype_SESSION_ipv4GPI = 3   (* IPSEC: Generalized Port Id *);
  {$EXTERNALSYM ctype_SESSION_ipv4GPI}

  SESSFLG_E_Police = $01    (* E_Police: Entry policing flag*);
  {$EXTERNALSYM SESSFLG_E_Police}

type
  Session_IPv4 = record
    sess_destaddr: IN_ADDR;  // DestAddress
    sess_protid: UCHAR;    // Protocol Id
    sess_flags: UCHAR;     // Use the flags defined above
    sess_destport: USHORT;  // DestPort
  end;
  {$EXTERNALSYM Session_IPv4}
  TSessionIPv4 = Session_IPv4;
  PSessionIPv4 = ^Session_IPv4;

(*    GPI versions have virtual dest port instead of dest port; this
 *    changes the interpretation but not the format, so we do not
 *    define new structs for GPI.
 *)

  RSVP_SESSION = record
    sess_header: RsvpObjHdr;
    case Integer of
      0: (sess_ipv4: Session_IPv4);
  end;
  {$EXTERNALSYM RSVP_SESSION}
  TRsvpSession = RSVP_SESSION;
  PRsvpSession = ^RSVP_SESSION;  

// Useful defines to access components of SESSION obect

//#define Sess4Addr       sess_u.sess_ipv4.sess_destaddr
//#define Sess4Port       sess_u.sess_ipv4.sess_destport
//#define Sess4Protocol   sess_u.sess_ipv4.sess_protid
//#define Sess4Flags      sess_u.sess_ipv4.sess_flags

(*
 *  RSVP HOP object
 *)

const
  ctype_RSVP_HOP_ipv4 = 1;
  {$EXTERNALSYM ctype_RSVP_HOP_ipv4}

type
  Rsvp_Hop_IPv4 = record
    hop_ipaddr: IN_ADDR;   // Next/Previous Hop Address
    hop_LIH: ULONG;        // Logical Interface Handle
  end;
  {$EXTERNALSYM Rsvp_Hop_IPv4}
  TRsvpHopIPv4 = Rsvp_Hop_IPv4;
  PRsvpHopIPv4 = ^Rsvp_Hop_IPv4;

  RSVP_HOP = record
    hop_header: RsvpObjHdr;
    case Integer of
      0: (hop_ipv4: Rsvp_Hop_IPv4);
  end;
  {$EXTERNALSYM RSVP_HOP}
  TRsvpHop = RSVP_HOP;
  PRsvpHop = ^RSVP_HOP;

//#define Hop4LIH    hop_u.hop_ipv4.hop_LIH
//#define Hop4Addr   hop_u.hop_ipv4.hop_ipaddr

(*
 *  RSVP STYLE object
 *)

//  Define values for option vector

const
  Opt_Share_mask = $00000018; // 2 bits: Sharing control
  {$EXTERNALSYM Opt_Share_mask}
  Opt_Distinct   = $00000008; // Distinct reservations
  {$EXTERNALSYM Opt_Distinct}
  Opt_Shared     = $00000010; // Shared reservations
  {$EXTERNALSYM Opt_Shared}

  Opt_SndSel_mask = $00000007; // 3 bits: Sender selection
  {$EXTERNALSYM Opt_SndSel_mask}
  Opt_Wildcard    = $00000001; // Wildcard scope
  {$EXTERNALSYM Opt_Wildcard}
  Opt_Explicit    = $00000002; // Explicit scope
  {$EXTERNALSYM Opt_Explicit}

function Style_is_Wildcard(p: DWORD): Boolean;
{$EXTERNALSYM Style_is_Wildcard}
function Style_is_Shared(p: DWORD): Boolean;
{$EXTERNALSYM Style_is_Shared}

//  Define style values

const
  STYLE_WF = Opt_Shared + Opt_Wildcard;
  {$EXTERNALSYM STYLE_WF}
  STYLE_FF = Opt_Distinct + Opt_Explicit;
  {$EXTERNALSYM STYLE_FF}
  STYLE_SE = Opt_Shared + Opt_Explicit;
  {$EXTERNALSYM STYLE_SE}

  ctype_STYLE = 1;
  {$EXTERNALSYM ctype_STYLE}

type
  RESV_STYLE = record
    style_header: RsvpObjHdr;
    style_word: ULONG;
  end;
  {$EXTERNALSYM RESV_STYLE}
  TResvStyle = RESV_STYLE;
  PResvStyle = ^RESV_STYLE;

(*
 *  RSVP FILTER SPEC object
 *)

const
  ctype_FILTER_SPEC_ipv4    = 1; // IPv4 FILTER_SPEC
  {$EXTERNALSYM ctype_FILTER_SPEC_ipv4}
  ctype_FILTER_SPEC_ipv4GPI = 4; // IPv4/GPI FILTER_SPEC
  {$EXTERNALSYM ctype_FILTER_SPEC_ipv4GPI}

type
  Filter_Spec_IPv4 = record
    filt_ipaddr: IN_ADDR;    // IPv4 SrcAddress
    filt_unused: USHORT;
    filt_port: USHORT;       // SrcPort
  end;
  {$EXTERNALSYM Filter_Spec_IPv4}
  TFilterSpecIPv4 = Filter_Spec_IPv4;
  PFilterSpecIPv4 = ^Filter_Spec_IPv4;

  Filter_Spec_IPv4GPI = record
    filt_ipaddr: IN_ADDR;    // IPv4 SrcAddress
    filt_gpi: ULONG;         // Generalized Port Id
  end;
  {$EXTERNALSYM Filter_Spec_IPv4GPI}
  TFilterSpecIPv4GPI = Filter_Spec_IPv4GPI;
  PFilterSpecIPv4GPI = ^Filter_Spec_IPv4GPI;

  FILTER_SPEC = record
    filt_header: RsvpObjHdr;
    case Integer of
      0: (filt_ipv4: Filter_Spec_IPv4);
      1: (filt_ipv4gpi: Filter_Spec_IPv4GPI);
  end;
  {$EXTERNALSYM FILTER_SPEC}
  TFilterSpec = FILTER_SPEC;
  PFilterSpec = ^FILTER_SPEC;  

//#define FilterSrcaddr   filt_u.filt_ipv4.filt_ipaddr
//#define FilterSrcport   filt_u.filt_ipv4.filt_port

(*
 *  RSVP SENDER_TEMPLATE object
 *)

const
  ctype_SENDER_TEMPLATE_ipv4    = 1; // IPv4 SENDER_TEMPLATE
  {$EXTERNALSYM ctype_SENDER_TEMPLATE_ipv4}
  ctype_SENDER_TEMPLATE_ipv4GPI = 4; // IPv4/GPI SENDER_TEMPLATE
  {$EXTERNALSYM ctype_SENDER_TEMPLATE_ipv4GPI}

type
  SENDER_TEMPLATE = FILTER_SPEC;       // Identical to FILTER_SPEC
  {$EXTERNALSYM SENDER_TEMPLATE}
  TSenderTemplate = SENDER_TEMPLATE;
  PSenderTemplate = ^SENDER_TEMPLATE;

(*
 *  RSVP SCOPE object class
 *)

const
  ctype_SCOPE_list_ipv4 = 1;
  {$EXTERNALSYM ctype_SCOPE_list_ipv4}

type
  Scope_list_ipv4 = record
    scopl_ipaddr: array [0..0] of IN_ADDR;        // var-len list of IP sender addrs
  end;
  {$EXTERNALSYM Scope_list_ipv4}
  TScopeListIPv4 = Scope_list_ipv4;
  PScopeListIPv4 = ^Scope_list_ipv4;

  RSVP_SCOPE = record
    scopl_header: RsvpObjHdr;
    case Integer of
      0: (scopl_ipv4: Scope_list_ipv4);
  end;
  {$EXTERNALSYM RSVP_SCOPE}
  TRsvpScope = RSVP_SCOPE;
  PRsvpScope = ^RSVP_SCOPE;

//#define Scope4Addr      scope_u.scopl_ipv4.scopl_ipaddr
//#define ScopeCnt(scp)   ((ObjLength(scp)-sizeof(RsvpObjHdr))/sizeof(struct in_addr))
//#define ScopeLen(cnt)   (cnt*sizeof(struct in_addr)+sizeof(RsvpObjHdr))

(*
 *  ERROR_SPEC object class
 *)

const
  ctype_ERROR_SPEC_ipv4 = 1;
  {$EXTERNALSYM ctype_ERROR_SPEC_ipv4}

  ERROR_SPECF_InPlace = $01;    (*   Left resv in place     *)
  {$EXTERNALSYM ERROR_SPECF_InPlace}
  ERROR_SPECF_NotGuilty = $02;    (*   This rcvr not guilty   *)
  {$EXTERNALSYM ERROR_SPECF_NotGuilty}
  ERR_FORWARD_OK  = $8000;      (* Flag: OK to forward state *)
  {$EXTERNALSYM ERR_FORWARD_OK}

function Error_Usage(x: DWORD): DWORD;
{$EXTERNALSYM Error_Usage}

const
  ERR_Usage_globl = $00;        (* Globally-defined sub-code *)
  {$EXTERNALSYM ERR_Usage_globl}
  ERR_Usage_local = $10;        (* Locally-defined sub-code *)
  {$EXTERNALSYM ERR_Usage_local}
  ERR_Usage_serv  = $11;        (* Service-defined sub-code *)
  {$EXTERNALSYM ERR_Usage_serv}
  ERR_global_mask = $0fff;      (* Sub-code bits in Error Val *)
  {$EXTERNALSYM ERR_global_mask}

type
  Error_Spec_IPv4 = record
    errs_errnode: in_addr;   (* Error Node Address       *)
    errs_flags: u_char;      (* Flags:           *)
    errs_code: UCHAR;        (* Error Code (def'd below) *)
    errs_value: USHORT;      (* Error Value      *)
  end;
  {$EXTERNALSYM Error_Spec_IPv4}
  TErrorSpecIPv4 = Error_Spec_IPv4;
  PErrorSpecIPv4 = ^Error_Spec_IPv4;

type
  ERROR_SPEC = record
    errs_header: RsvpObjHdr;
    case Integer of
      0: (errs_ipv4: Error_Spec_IPv4);
  end;
  {$EXTERNALSYM ERROR_SPEC}
  TErrorSpec = ERROR_SPEC;
  PErrorSpec = ^ERROR_SPEC;

//#define errspec4_enode  errs_u.errs_ipv4.errs_errnode
//#define errspec4_code   errs_u.errs_ipv4.errs_code
//#define errspec4_value  errs_u.errs_ipv4.errs_value
//#define errspec4_flags  errs_u.errs_ipv4.errs_flags

(*
 *  POLICY_DATA object class
 *
 *      Contents are Opaque RSVP/SBM
 *)

const
  ctype_POLICY_DATA = 1;
  {$EXTERNALSYM ctype_POLICY_DATA}

type
  POLICY_DATA = record
    PolicyObjHdr: RsvpObjHdr;
    usPeOffset: USHORT;     // Offset to the start of Policy Elements from the begining of Policy Data
    usReserved: USHORT;
  end;
  {$EXTERNALSYM POLICY_DATA}
  TPolicyData = POLICY_DATA;
  PPolicyData = ^POLICY_DATA;

const
  PD_HDR_LEN  = SizeOf(POLICY_DATA);
  {$EXTERNALSYM PD_HDR_LEN}

type
  POLICY_ELEMENT = record
    usPeLength: USHORT;     // Policy Element length
    usPeType: USHORT;       // Policy Element type
    ucPeData: array [0..3] of UCHAR;    // Just a place holder to the start of Policy Element data
  end;
  {$EXTERNALSYM POLICY_ELEMENT}
  TPolicyElement = POLICY_ELEMENT;
  PPolicyElement = ^POLICY_ELEMENT;

const
  PE_HDR_LEN = 2 * SizeOf(USHORT);
  {$EXTERNALSYM PE_HDR_LEN}

(**************************************************************************
 *
 *  Int-Serv Data Structures
 *
 **************************************************************************)

(*
 *  Service numbers
 *)

const
  GENERAL_INFO          = 1;
  {$EXTERNALSYM GENERAL_INFO}
  GUARANTEED_SERV       = 2;
  {$EXTERNALSYM GUARANTEED_SERV}
  PREDICTIVE_SERV       = 3;
  {$EXTERNALSYM PREDICTIVE_SERV}
  CONTROLLED_DELAY_SERV = 4;
  {$EXTERNALSYM CONTROLLED_DELAY_SERV}
  CONTROLLED_LOAD_SERV  = 5;
  {$EXTERNALSYM CONTROLLED_LOAD_SERV}
  QUALITATIVE_SERV      = 6;
  {$EXTERNALSYM QUALITATIVE_SERV}

(*
 *  Well-known parameter IDs
 *)

const
  IS_WKP_HOP_CNT =        4;
  {$EXTERNALSYM IS_WKP_HOP_CNT}
  IS_WKP_PATH_BW =        6;
  {$EXTERNALSYM IS_WKP_PATH_BW}
  IS_WKP_MIN_LATENCY =    8;
  {$EXTERNALSYM IS_WKP_MIN_LATENCY}
  IS_WKP_COMPOSED_MTU =   10;
  {$EXTERNALSYM IS_WKP_COMPOSED_MTU}
  IS_WKP_TB_TSPEC =       127; (* Token-bucket TSPEC parm *)
  {$EXTERNALSYM IS_WKP_TB_TSPEC}
  IS_WKP_Q_TSPEC =        128;
  {$EXTERNALSYM IS_WKP_Q_TSPEC}

type
  int_serv_wkp = DWORD;
  {$EXTERNALSYM int_serv_wkp}
  TIntServWkp = int_serv_wkp;

(*
 *  Int-serv Main header
 *)

  IntServMainHdr = record
    ismh_version: UCHAR;    // Version
    ismh_unused: UCHAR;
    ismh_len32b: USHORT;    // # 32-bit words excluding this hdr
  end;
  {$EXTERNALSYM IntServMainHdr}
  TIntServMainHdr = IntServMainHdr;
  PIntServMainHdr = ^IntServMainHdr;

const
  INTSERV_VERS_MASK   = $f0;
  {$EXTERNALSYM INTSERV_VERS_MASK}
  INTSERV_VERSION0    = 0;
  {$EXTERNALSYM INTSERV_VERSION0}

function Intserv_Version(x: DWORD): DWORD;
{$EXTERNALSYM Intserv_Version}
function Intserv_Version_OK(const x: TIntServMainHdr): Boolean;
{$EXTERNALSYM Intserv_Version_OK}

// Convert ishm_length to equivalent RSVP object size, for checking

function Intserv_Obj_size(const x: TIntServMainHdr): DWORD;
{$EXTERNALSYM Intserv_Obj_size}

(*
 *  Int-serv Service Element Header
 *)

// Flag: Break bit

const
  ISSH_BREAK_BIT = $80;
  {$EXTERNALSYM ISSH_BREAK_BIT}

type
  IntServServiceHdr = record
    issh_service: UCHAR;   // Service number
    issh_flags: UCHAR;     // Flag byte
    issh_len32b: USHORT;    // #32-bit words excluding this hdr
  end;
  {$EXTERNALSYM IntServServiceHdr}
  TIntServServiceHdr = IntServServiceHdr;
  PIntServServiceHdr = ^IntServServiceHdr;

function Issh_len32b(const p: TIntServServiceHdr): USHORT;
{$EXTERNALSYM Issh_len32b}

(*
 *  Int-serv Parameter Element Header
 *)

const
  ISPH_FLG_INV = $80; // Flag: Invalid
  {$EXTERNALSYM ISPH_FLG_INV}

type
  IntServParmHdr = record
    isph_parm_num: UCHAR;  // Parameter number
    isph_flags: UCHAR;     // Flags
    isph_len32b: USHORT;    // #32-bit words excluding this hdr
  end;
  {$EXTERNALSYM IntServParmHdr}
  TIntServParmHdr = IntServParmHdr;
  PIntServParmHdr = ^IntServParmHdr;

{
function Next_Main_Hdr(const p: TIntServMainHdr): PIntServMainHdr;
begin
   TODO (IntServMainHdr *)((ULONG *)(p)+1+(p)->ismh_len32b)
end;

function Next_Serv_Hdr(const p: TIntServMainHdr): ULONG;
begin
   TODO (IntServServiceHdr *)((ULONG *)(p)+1+(p)->issh_len32b)
end;

function Next_Parm_Hdr(const p: TIntServParmHdr): ULONG;
begin
   TODO (IntServParmHdr *)((ULONG *)(p)+1+(p)->isph_len32b)
end;
}

(*
 *  Generic Tspec Parameters
 *)

type
  GenTspecParms = record
    TB_Tspec_r: FLOAT;     // Token bucket rate (B/sec)
    TB_Tspec_b: FLOAT;     // Token bucket depth (B)
    TB_Tspec_p: FLOAT;     // Peak data rate (B/sec)
    TB_Tspec_m: ULONG;     // Min Policed Unit (B)
    TB_Tspec_M_: ULONG;     // Max pkt size (B)
  end;
  {$EXTERNALSYM GenTspecParms}
  TGenTspecParms = GenTspecParms;
  PGenTspecParms = ^GenTspecParms;

(*
 *  Generic Tspec
 *)

  GenTspec = record
    gen_Tspec_serv_hdr: IntServServiceHdr; // (GENERAL_INFO, length)
    gen_Tspec_parm_hdr: IntServParmHdr; // (IS_WKP_TB_TSPEC)
    gen_Tspec_parms: GenTspecParms;
  end;
  {$EXTERNALSYM GenTspec}
  TGenTspec = GenTspec;
  PGenTspec = ^GenTspec;

//#define gtspec_r        gen_Tspec_parms.TB_Tspec_r
//#define gtspec_b        gen_Tspec_parms.TB_Tspec_b
//#define gtspec_m        gen_Tspec_parms.TB_Tspec_m
//#define gtspec_M        gen_Tspec_parms.TB_Tspec_M
//#define gtspec_p        gen_Tspec_parms.TB_Tspec_p
//#define gtspec_parmno   gen_Tspec_parm_hdr.isph_parm_num
//#define gtspec_flags    gen_Tspec_parm_hdr.isph_flags

//#define gtspec_len      (sizeof(GenTspec) - sizeof(IntServServiceHdr))

(* contents of qualitative tspec *)

type
  QualTspecParms = record
    TB_Tspec_M: ULONG;     // Max pkt size (M)
  end;
  {$EXTERNALSYM QualTspecParms}
  TQualTspecParms = QualTspecParms;
  PQualTspecParms = ^QualTspecParms;

  QualTspec = record
    qual_Tspec_serv_hdr: IntServServiceHdr; // (QUALITATIVE_SERV, length)
    qual_Tspec_parm_hdr: IntServParmHdr; // (IS_WKP_Q_TSPEC)
    qual_Tspec_parms: QualTspecParms;
  end;
  {$EXTERNALSYM QualTspec}
  TQualTspec = QualTspec;
  PQualTspec = ^QualTspec;

  QualAppFlowSpec = record
    Q_spec_serv_hdr: IntServServiceHdr;    // (QUALITATIVE_SERV,0,len)
    Q_spec_parm_hdr: IntServParmHdr;    // (IS_WKP_Q_TSPEC)
    Q_spec_parms: QualTspecParms;       // QUALITATIVE Tspec parameters
  end;
  {$EXTERNALSYM QualAppFlowSpec}
  TQualAppFlowSpec = QualAppFlowSpec;
  PQualAppFlowSpec = ^QualAppFlowSpec;

//#define QAspec_M        Q_spec_parms.TB_Tspec_M

(*
 *  Contents of int-serv Tspec
 *)

  IntServTspecBody = record
    st_mh: IntServMainHdr;
    case Integer of
      0: (gen_stspec: GenTspec); // Generic Tspec
      1: (qual_stspec: QualTspec);
  end;
  {$EXTERNALSYM IntServTspecBody}
  TIntServTspecBody = IntServTspecBody;
  PIntServTspecBody = ^IntServTspecBody;

(*
 *  SENDER_TSPEC class object
 *)

const
  ctype_SENDER_TSPEC = 2;
  {$EXTERNALSYM ctype_SENDER_TSPEC}

type
  SENDER_TSPEC = record
    stspec_header: RsvpObjHdr;
    stspec_body: IntServTspecBody;
  end;
  {$EXTERNALSYM SENDER_TSPEC}
  TSenderTSpec = SENDER_TSPEC;
  PSenderTSpec = ^SENDER_TSPEC;

(*
 *  Controlled-Load Flowspec
 *)

  CtrlLoadFlowspec = record
    CL_spec_serv_hdr: IntServServiceHdr;    // (CONTROLLED_LOAD_SERV,0,len)
    CL_spec_parm_hdr: IntServParmHdr;    // (IS_WKP_TB_TSPEC)
    CL_spec_parms: GenTspecParms;       // GENERIC Tspec parameters
  end;
  {$EXTERNALSYM CtrlLoadFlowspec}
  TCtrlLoadFlowspec = CtrlLoadFlowspec;
  PCtrlLoadFlowspec = ^CtrlLoadFlowspec;

//#define CLspec_r        CL_spec_parms.TB_Tspec_r
//#define CLspec_b        CL_spec_parms.TB_Tspec_b
//#define CLspec_p        CL_spec_parms.TB_Tspec_p
//#define CLspec_m        CL_spec_parms.TB_Tspec_m
//#define CLspec_M        CL_spec_parms.TB_Tspec_M
//#define CLspec_parmno   CL_spec_parm_hdr.isph_parm_num
//#define CLspec_flags    CL_spec_parm_hdr.isph_flags
//#define CLspec_len32b   CL_spec_parm_hdr.isph_len32b

//#define CLspec_len      (sizeof(CtrlLoadFlowspec) - sizeof(IntServServiceHdr))

(*  Service-specific Parameter IDs
 *)

const
  IS_GUAR_RSPEC     = 130;
  {$EXTERNALSYM IS_GUAR_RSPEC}

  GUAR_ADSPARM_C    = 131;
  {$EXTERNALSYM GUAR_ADSPARM_C}
  GUAR_ADSPARM_D    = 132;
  {$EXTERNALSYM GUAR_ADSPARM_D}
  GUAR_ADSPARM_Ctot = 133;
  {$EXTERNALSYM GUAR_ADSPARM_Ctot}
  GUAR_ADSPARM_Dtot = 134;
  {$EXTERNALSYM GUAR_ADSPARM_Dtot}
  GUAR_ADSPARM_Csum = 135;
  {$EXTERNALSYM GUAR_ADSPARM_Csum}
  GUAR_ADSPARM_Dsum = 136;
  {$EXTERNALSYM GUAR_ADSPARM_Dsum}

(*
 *  Guaranteed Rspec parameters
 *)

type
  GuarRspec = record
    Guar_R: FLOAT;         //  Guaranteed Rate B/s
    Guar_S: ULONG;         //  Slack term secs
  end;
  {$EXTERNALSYM GuarRspec}
  TGuarRspec = GuarRspec;
  PGuarRspec = ^GuarRspec;

(*
 *  Guaranteed Flowspec
 *)

  GuarFlowSpec = record
    Guar_serv_hdr: IntServServiceHdr;      // (GUARANTEED, 0, length)
    Guar_Tspec_hdr: IntServParmHdr;     // (IS_WKP_TB_TSPEC,)
    Guar_Tspec_parms: GenTspecParms;   // GENERIC Tspec parms
    Guar_Rspec_hdr: IntServParmHdr;     // (IS_GUAR_RSPEC)
    Guar_Rspec: GuarRspec;         // Guaranteed rate (B/sec)
  end;
  {$EXTERNALSYM GuarFlowSpec}
  TGuarFlowSpec = GuarFlowSpec;
  PGuarFlowSpec = ^GuarFlowSpec;

//#define Gspec_r         Guar_Tspec_parms.TB_Tspec_r
//#define Gspec_b         Guar_Tspec_parms.TB_Tspec_b
//#define Gspec_p         Guar_Tspec_parms.TB_Tspec_p
//#define Gspec_m         Guar_Tspec_parms.TB_Tspec_m
//#define Gspec_M         Guar_Tspec_parms.TB_Tspec_M
//#define Gspec_R         Guar_Rspec.Guar_R
//#define Gspec_S         Guar_Rspec.Guar_S
//#define Gspec_T_parmno  Guar_Tspec_hdr.isph_parm_num
//#define Gspec_T_flags   Guar_Tspec_hdr.isph_flags
//#define Gspec_R_parmno  Guar_Rspec_hdr.isph_parm_num
//#define Gspec_R_flags   Guar_Rspec_hdr.isph_flags

//#define Gspec_len       (sizeof(GuarFlowSpec) - sizeof(IntServServiceHdr))

(*
 *  Contents of int-serv flowspec
 *)

type
  IntServFlowSpec = record
    spec_mh: IntServMainHdr;
    case Integer of
        0: (CL_spec: CtrlLoadFlowspec);   // Controlled-Load service
        1: (G_spec: GuarFlowSpec);    // Guaranteed service
        2: (Q_spec: QualAppFlowSpec);
  end;
  {$EXTERNALSYM IntServFlowSpec}
  TIntServFlowSpec = IntServFlowSpec;
  PIntServFlowSpec = ^IntServFlowSpec;

//#define ISmh_len32b     spec_mh.ismh_len32b
//#define ISmh_version    spec_mh.ismh_version
//#define ISmh_unused     spec_mh.ismh_unused

(*
 *  Int-Serv FLOWSPEC object
 *)

const
  ctype_FLOWSPEC_Intserv0 = 2; // The int-serv flowspec (v.0)
  {$EXTERNALSYM ctype_FLOWSPEC_Intserv0}

type
  IS_FLOWSPEC = record
    flow_header: RsvpObjHdr;
    flow_body: IntServFlowSpec;
  end;
  {$EXTERNALSYM IS_FLOWSPEC}
  TIsFlowSpec = IS_FLOWSPEC;
  PIsFlowSpec = ^IS_FLOWSPEC;

(*
 *  FLOW DESCRIPTOR
 *)

  FLOW_DESC = record
    u1: record
    case Integer of
      0: (stspec: ^SENDER_TSPEC);
      1: (isflow: ^IS_FLOWSPEC);
    end;
    u2: record
    case Integer of
      0: (stemp: ^SENDER_TEMPLATE);
      1: (fspec: ^FILTER_SPEC);
    end;
  end;
  {$EXTERNALSYM FLOW_DESC}
  TFlowDesc = FLOW_DESC;
  PFlowDesc = ^FLOW_DESC;

//#define FdSenderTspec       u1.stspec
//#define FdIsFlowSpec        u1.isflow

//#define FdSenderTemplate    u2.stemp
//#define FdFilterSpec        u2.fspec

(*
 *  ADSPEC class object
 *
 *      Opaque to RSVP -- Contents defined in rapi_lib.h
 *)

const
  ctype_ADSPEC_INTSERV = 2;
  {$EXTERNALSYM ctype_ADSPEC_INTSERV}

(*
 *  Guaranteed service Adspec parameters -- fixed part
 *)

type
  Gads_parms_t = record
    Gads_serv_hdr: IntServServiceHdr;  // GUARANTEED, x, len
    Gads_Ctot_hdr: IntServParmHdr;  // GUAR_ADSPARM_Ctot
    Gads_Ctot: ULONG;
    Gads_Dtot_hdr: IntServParmHdr;  // (GUAR_ADSPARM_Dtot
    Gads_Dtot: ULONG;
    Gads_Csum_hdr: IntServParmHdr;  // GUAR_ADSPARM_Csum
    Gads_Csum: ULONG;
    Gads_Dsum_hdr: IntServParmHdr;  // GUAR_ADSPARM_Dsum
    Gads_Dsum: ULONG;
    (*
     *  May be followed by override general param values
     *)
  end;
  {$EXTERNALSYM Gads_parms_t}
  TGadsParmsT = Gads_parms_t;
  PGadsParmsT = ^Gads_parms_t;

(*
 *  General Path Characterization Parameters
 *)
 
  GenAdspecParams = record
    gen_parm_hdr: IntServServiceHdr;           // GENERAL_INFO, len
    gen_parm_hopcnt_hdr: IntServParmHdr;    // (IS_WKP_HOP_CNT
    gen_parm_hopcnt: ULONG;
    gen_parm_pathbw_hdr: IntServParmHdr;    // IS_WKP_PATH_BW
    gen_parm_path_bw: FLOAT;
    gen_parm_minlat_hdr: IntServParmHdr;    // IS_WKP_MIN_LATENCY
    gen_parm_min_latency: ULONG;
    gen_parm_compmtu_hdr: IntServParmHdr;   // IS_WKP_COMPOSED_MTU
    gen_parm_composed_MTU: ULONG;
  end;
  {$EXTERNALSYM GenAdspecParams}
  TGenAdspecParams = GenAdspecParams;
  PGenAdspecParams = ^GenAdspecParams;

(*
 *  Contents of (minimal) int-serv Adspec
 *)

  IS_ADSPEC_BODY = record
    adspec_mh: IntServMainHdr;      // Main header
    adspec_genparms: GenAdspecParams;// General char parm fragment
    (*
     *  Followed by variable-length fragments for some or all
     *  services.  These can be minimal length fragments.
     *)
  end;
  {$EXTERNALSYM IS_ADSPEC_BODY}
  TIsAdSpecBody = IS_ADSPEC_BODY;
  PIsAdSpecBody = ^IS_ADSPEC_BODY;  

//const TODO Unknown Object_Header
//  GEN_ADSPEC_LEN = SizeOf(Object_header) + SizeOf(IS_adsbody_t);
//  {$EXTERNALSYM GEN_ADSPEC_LEN}

type
  ADSPEC = record
    adspec_header: RsvpObjHdr;
    adspec_body: IS_ADSPEC_BODY;    (* Defined in rapi_lib.h *)
  end;
  {$EXTERNALSYM ADSPEC}
  TAdSpec = ADSPEC;
  PAdSpec = ^ADSPEC;

// RSVP message types

const
  RSVP_PATH      = 1;
  {$EXTERNALSYM RSVP_PATH}
  RSVP_RESV      = 2;
  {$EXTERNALSYM RSVP_RESV}
  RSVP_PATH_ERR  = 3;
  {$EXTERNALSYM RSVP_PATH_ERR}
  RSVP_RESV_ERR  = 4;
  {$EXTERNALSYM RSVP_RESV_ERR}
  RSVP_PATH_TEAR = 5;
  {$EXTERNALSYM RSVP_PATH_TEAR}
  RSVP_RESV_TEAR = 6;
  {$EXTERNALSYM RSVP_RESV_TEAR}

(*  RSVP error codes
 *)

  RSVP_Err_NONE  = 0;   (* No error (CONFIRM)       *)
  {$EXTERNALSYM RSVP_Err_NONE}
  RSVP_Erv_Nonev = 0;   (*    No-error Error Value  *)
  {$EXTERNALSYM RSVP_Erv_Nonev}

(* Admission Control failure    *)

  RSVP_Err_ADMISSION = 1;
  {$EXTERNALSYM RSVP_Err_ADMISSION}

(* Globally-defined sub-codes for : Admission Control failure *)

  RSVP_Erv_Other     = 0;   (* Unspecified cause        *)
  {$EXTERNALSYM RSVP_Erv_Other}
  RSVP_Erv_DelayBnd  = 1;   (* Cannot meet delay bound req  *)
  {$EXTERNALSYM RSVP_Erv_DelayBnd}
  RSVP_Erv_Bandwidth = 2;   (* Insufficient bandwidth   *)
  {$EXTERNALSYM RSVP_Erv_Bandwidth}
  RSVP_Erv_MTU       = 3;   (* MTU in flowspec too large    *)
  {$EXTERNALSYM RSVP_Erv_MTU}

// Microsoft specific error values

  RSVP_Erv_Flow_Rate         = $8001;
  {$EXTERNALSYM RSVP_Erv_Flow_Rate}
  RSVP_Erv_Bucket_szie       = $8002;
  {$EXTERNALSYM RSVP_Erv_Bucket_szie}
  RSVP_Erv_Peak_Rate         = $8003;
  {$EXTERNALSYM RSVP_Erv_Peak_Rate}
  RSVP_Erv_Min_Policied_size = $8004;
  {$EXTERNALSYM RSVP_Erv_Min_Policied_size}

(* Policy control failure   *)

  RSVP_Err_POLICY = 2;
  {$EXTERNALSYM RSVP_Err_POLICY}

// Policy error values from Identity draft

  POLICY_ERRV_NO_MORE_INFO                = 1;
  {$EXTERNALSYM POLICY_ERRV_NO_MORE_INFO}
  POLICY_ERRV_UNSUPPORTED_CREDENTIAL_TYPE = 2;
  {$EXTERNALSYM POLICY_ERRV_UNSUPPORTED_CREDENTIAL_TYPE}
  POLICY_ERRV_INSUFFICIENT_PRIVILEGES     = 3;
  {$EXTERNALSYM POLICY_ERRV_INSUFFICIENT_PRIVILEGES}
  POLICY_ERRV_EXPIRED_CREDENTIALS         = 4;
  {$EXTERNALSYM POLICY_ERRV_EXPIRED_CREDENTIALS}
  POLICY_ERRV_IDENTITY_CHANGED            = 5;
  {$EXTERNALSYM POLICY_ERRV_IDENTITY_CHANGED}

// Microsoft specific policy error values

  POLICY_ERRV_UNKNOWN = 0;
  {$EXTERNALSYM POLICY_ERRV_UNKNOWN}

  POLICY_ERRV_GLOBAL_DEF_FLOW_COUNT         = 1;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_DEF_FLOW_COUNT}
  POLICY_ERRV_GLOBAL_GRP_FLOW_COUNT         = 2;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_GRP_FLOW_COUNT}
  POLICY_ERRV_GLOBAL_USER_FLOW_COUNT        = 3;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_USER_FLOW_COUNT}
  POLICY_ERRV_GLOBAL_UNAUTH_USER_FLOW_COUNT = 4;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_UNAUTH_USER_FLOW_COUNT}
  POLICY_ERRV_SUBNET_DEF_FLOW_COUNT         = 5;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_DEF_FLOW_COUNT}
  POLICY_ERRV_SUBNET_GRP_FLOW_COUNT         = 6;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_GRP_FLOW_COUNT}
  POLICY_ERRV_SUBNET_USER_FLOW_COUNT        = 7;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_USER_FLOW_COUNT}
  POLICY_ERRV_SUBNET_UNAUTH_USER_FLOW_COUNT = 8;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_UNAUTH_USER_FLOW_COUNT}

  POLICY_ERRV_GLOBAL_DEF_FLOW_DURATION         = 9;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_DEF_FLOW_DURATION}
  POLICY_ERRV_GLOBAL_GRP_FLOW_DURATION         = 10;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_GRP_FLOW_DURATION}
  POLICY_ERRV_GLOBAL_USER_FLOW_DURATION        = 11;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_USER_FLOW_DURATION}
  POLICY_ERRV_GLOBAL_UNAUTH_USER_FLOW_DURATION = 12;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_UNAUTH_USER_FLOW_DURATION}
  POLICY_ERRV_SUBNET_DEF_FLOW_DURATION         = 13;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_DEF_FLOW_DURATION}
  POLICY_ERRV_SUBNET_GRP_FLOW_DURATION         = 14;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_GRP_FLOW_DURATION}
  POLICY_ERRV_SUBNET_USER_FLOW_DURATION        = 15;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_USER_FLOW_DURATION}
  POLICY_ERRV_SUBNET_UNAUTH_USER_FLOW_DURATION = 16;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_UNAUTH_USER_FLOW_DURATION}

  POLICY_ERRV_GLOBAL_DEF_FLOW_RATE         = 17;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_DEF_FLOW_RATE}
  POLICY_ERRV_GLOBAL_GRP_FLOW_RATE         = 18;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_GRP_FLOW_RATE}
  POLICY_ERRV_GLOBAL_USER_FLOW_RATE        = 19;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_USER_FLOW_RATE}
  POLICY_ERRV_GLOBAL_UNAUTH_USER_FLOW_RATE = 20;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_UNAUTH_USER_FLOW_RATE}
  POLICY_ERRV_SUBNET_DEF_FLOW_RATE         = 21;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_DEF_FLOW_RATE}
  POLICY_ERRV_SUBNET_GRP_FLOW_RATE         = 22;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_GRP_FLOW_RATE}
  POLICY_ERRV_SUBNET_USER_FLOW_RATE        = 23;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_USER_FLOW_RATE}
  POLICY_ERRV_SUBNET_UNAUTH_USER_FLOW_RATE = 24;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_UNAUTH_USER_FLOW_RATE}

  POLICY_ERRV_GLOBAL_DEF_PEAK_RATE         = 25;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_DEF_PEAK_RATE}
  POLICY_ERRV_GLOBAL_GRP_PEAK_RATE         = 26;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_GRP_PEAK_RATE}
  POLICY_ERRV_GLOBAL_USER_PEAK_RATE        = 27;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_USER_PEAK_RATE}
  POLICY_ERRV_GLOBAL_UNAUTH_USER_PEAK_RATE = 28;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_UNAUTH_USER_PEAK_RATE}
  POLICY_ERRV_SUBNET_DEF_PEAK_RATE         = 29;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_DEF_PEAK_RATE}
  POLICY_ERRV_SUBNET_GRP_PEAK_RATE         = 30;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_GRP_PEAK_RATE}
  POLICY_ERRV_SUBNET_USER_PEAK_RATE        = 31;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_USER_PEAK_RATE}
  POLICY_ERRV_SUBNET_UNAUTH_USER_PEAK_RATE = 32;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_UNAUTH_USER_PEAK_RATE}

  POLICY_ERRV_GLOBAL_DEF_SUM_FLOW_RATE         = 33;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_DEF_SUM_FLOW_RATE}
  POLICY_ERRV_GLOBAL_GRP_SUM_FLOW_RATE         = 34;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_GRP_SUM_FLOW_RATE}
  POLICY_ERRV_GLOBAL_USER_SUM_FLOW_RATE        = 35;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_USER_SUM_FLOW_RATE}
  POLICY_ERRV_GLOBAL_UNAUTH_USER_SUM_FLOW_RATE = 36;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_UNAUTH_USER_SUM_FLOW_RATE}
  POLICY_ERRV_SUBNET_DEF_SUM_FLOW_RATE         = 37;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_DEF_SUM_FLOW_RATE}
  POLICY_ERRV_SUBNET_GRP_SUM_FLOW_RATE         = 38;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_GRP_SUM_FLOW_RATE}
  POLICY_ERRV_SUBNET_USER_SUM_FLOW_RATE        = 39;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_USER_SUM_FLOW_RATE}
  POLICY_ERRV_SUBNET_UNAUTH_USER_SUM_FLOW_RATE = 40;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_UNAUTH_USER_SUM_FLOW_RATE}

  POLICY_ERRV_GLOBAL_DEF_SUM_PEAK_RATE         = 41;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_DEF_SUM_PEAK_RATE}
  POLICY_ERRV_GLOBAL_GRP_SUM_PEAK_RATE         = 42;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_GRP_SUM_PEAK_RATE}
  POLICY_ERRV_GLOBAL_USER_SUM_PEAK_RATE        = 43;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_USER_SUM_PEAK_RATE}
  POLICY_ERRV_GLOBAL_UNAUTH_USER_SUM_PEAK_RATE = 44;
  {$EXTERNALSYM POLICY_ERRV_GLOBAL_UNAUTH_USER_SUM_PEAK_RATE}
  POLICY_ERRV_SUBNET_DEF_SUM_PEAK_RATE         = 45;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_DEF_SUM_PEAK_RATE}
  POLICY_ERRV_SUBNET_GRP_SUM_PEAK_RATE         = 46;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_GRP_SUM_PEAK_RATE}
  POLICY_ERRV_SUBNET_USER_SUM_PEAK_RATE        = 47;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_USER_SUM_PEAK_RATE}
  POLICY_ERRV_SUBNET_UNAUTH_USER_SUM_PEAK_RATE = 48;
  {$EXTERNALSYM POLICY_ERRV_SUBNET_UNAUTH_USER_SUM_PEAK_RATE}

  POLICY_ERRV_UNKNOWN_USER       = 49;
  {$EXTERNALSYM POLICY_ERRV_UNKNOWN_USER}
  POLICY_ERRV_NO_PRIVILEGES      = 50;
  {$EXTERNALSYM POLICY_ERRV_NO_PRIVILEGES}
  POLICY_ERRV_EXPIRED_USER_TOKEN = 51;
  {$EXTERNALSYM POLICY_ERRV_EXPIRED_USER_TOKEN}
  POLICY_ERRV_NO_RESOURCES       = 52;
  {$EXTERNALSYM POLICY_ERRV_NO_RESOURCES}
  POLICY_ERRV_PRE_EMPTED         = 53;
  {$EXTERNALSYM POLICY_ERRV_PRE_EMPTED}
  POLICY_ERRV_USER_CHANGED       = 54;
  {$EXTERNALSYM POLICY_ERRV_USER_CHANGED}
  POLICY_ERRV_NO_ACCEPTS         = 55;
  {$EXTERNALSYM POLICY_ERRV_NO_ACCEPTS}
  POLICY_ERRV_NO_MEMORY          = 56;
  {$EXTERNALSYM POLICY_ERRV_NO_MEMORY}
  POLICY_ERRV_CRAZY_FLOWSPEC     = 57;
  {$EXTERNALSYM POLICY_ERRV_CRAZY_FLOWSPEC}

// Other RSVP defined Error codes

  RSVP_Err_NO_PATH       = 3;   (* No path state for Resv   *)
  {$EXTERNALSYM RSVP_Err_NO_PATH}
  RSVP_Err_NO_SENDER     = 4;   (* No sender info for Resv  *)
  {$EXTERNALSYM RSVP_Err_NO_SENDER}
  RSVP_Err_BAD_STYLE     = 5;   (* Conflicting style        *)
  {$EXTERNALSYM RSVP_Err_BAD_STYLE}
  RSVP_Err_UNKNOWN_STYLE = 6;   (* Unknown reservation style    *)
  {$EXTERNALSYM RSVP_Err_UNKNOWN_STYLE}
  RSVP_Err_BAD_DSTPORT   = 7;   (* Conflicting DstPort in Sess  *)
  {$EXTERNALSYM RSVP_Err_BAD_DSTPORT}
  RSVP_Err_BAD_SNDPORT   = 8;   (* Conflicting Sender port  *)
  {$EXTERNALSYM RSVP_Err_BAD_SNDPORT}
  RSVP_Err_AMBIG_FILTER  = 9;   (* Ambiguous Filter spec in Resv*)
  {$EXTERNALSYM RSVP_Err_AMBIG_FILTER}

  RSVP_Err_PREEMPTED     = 12;  (* Service Preempted        *)
  {$EXTERNALSYM RSVP_Err_PREEMPTED}

(* Unknown object Class-Num *)

  RSVP_Err_UNKN_OBJ_CLASS = 13;
  {$EXTERNALSYM RSVP_Err_UNKN_OBJ_CLASS}

(*   ErrVal = Class_num, CType  *)

 (* Unknown object C-Type    *)

  RSVP_Err_UNKNOWN_CTYPE = 14;
  {$EXTERNALSYM RSVP_Err_UNKNOWN_CTYPE}

(*   ErrVal = Class_num, CType  *)

  RSVP_Err_API_ERROR = 20;  (* API client error     *)
  {$EXTERNALSYM RSVP_Err_API_ERROR}

(*   ErrVal = API error code    *)

(* Traffic Control error    *)

  RSVP_Err_TC_ERROR = 21;
  {$EXTERNALSYM RSVP_Err_TC_ERROR}

(* Globally-defined sub-codes for : Traffic Control errors *)

  RSVP_Erv_Conflict_Serv  = 01;  (* Service Conflict     *)
  {$EXTERNALSYM RSVP_Erv_Conflict_Serv}
  RSVP_Erv_No_Serv        = 02;  (* Unknown Service      *)
  {$EXTERNALSYM RSVP_Erv_No_Serv}
  RSVP_Erv_Crazy_Flowspec = 03;  (* Unreasonable Flowspec    *)
  {$EXTERNALSYM RSVP_Erv_Crazy_Flowspec}
  RSVP_Erv_Crazy_Tspec    = 04;  (* Unreasonable Tspec       *)
  {$EXTERNALSYM RSVP_Erv_Crazy_Tspec}

  RSVP_Err_TC_SYS_ERROR = 22;  (* Traffic control system error *)
  {$EXTERNALSYM RSVP_Err_TC_SYS_ERROR}

(* ErrVal = kernel error code   *)

(* RSVP System error      *)

  RSVP_Err_RSVP_SYS_ERROR = 23;
  {$EXTERNALSYM RSVP_Err_RSVP_SYS_ERROR}

(* Globally-defined sub-codes for : RSVP system errors *)

  RSVP_Erv_MEMORY = 1;   (* Out of memory *)
  {$EXTERNALSYM RSVP_Erv_MEMORY}
  RSVP_Erv_API    = 2;   (* API logic error *)
  {$EXTERNALSYM RSVP_Erv_API}

// Identity Policy elements related defines

// Reseved Identity PE types

  LPM_PE_USER_IDENTITY = 2;
  {$EXTERNALSYM LPM_PE_USER_IDENTITY}
  LPM_PE_APP_IDENTITY  = 3;
  {$EXTERNALSYM LPM_PE_APP_IDENTITY}

// Defines for Identity error values

  ERROR_NO_MORE_INFO          = 1;
  {$EXTERNALSYM ERROR_NO_MORE_INFO}
  UNSUPPORTED_CREDENTIAL_TYPE = 2;
  {$EXTERNALSYM UNSUPPORTED_CREDENTIAL_TYPE}
  INSUFFICIENT_PRIVILEGES     = 3;
  {$EXTERNALSYM INSUFFICIENT_PRIVILEGES}
  EXPIRED_CREDENTIAL          = 4;
  {$EXTERNALSYM EXPIRED_CREDENTIAL}
  IDENTITY_CHANGED            = 5;
  {$EXTERNALSYM IDENTITY_CHANGED}

type
  ID_ERROR_OBJECT = record
    usIdErrLength: USHORT;
    ucAType: UCHAR;
    ucSubType: UCHAR;
    usReserved: USHORT;
    usIdErrorValue: USHORT;
    ucIdErrData: array [0..3] of UCHAR;
  end;
  {$EXTERNALSYM ID_ERROR_OBJECT}
  TIdErrorObject = ID_ERROR_OBJECT;
  PIdErrorObject = ^ID_ERROR_OBJECT;

const
  ID_ERR_OBJ_HDR_LEN = SizeOf(ID_ERROR_OBJECT) - 4 * SizeOf(UCHAR);
  {$EXTERNALSYM ID_ERR_OBJ_HDR_LEN}

(*

    LPM API specific definitions

*)

(**************************************

    LPM_Initialize

***************************************)

type
  LPM_HANDLE = HANDLE;
  {$EXTERNALSYM LPM_HANDLE}

  RHANDLE = HANDLE;
  {$EXTERNALSYM RHANDLE}

  LPV = ULONG;
  {$EXTERNALSYM LPV}

  PETYPE = USHORT;
  {$EXTERNALSYM PETYPE}

const
  LPM_OK = 0;
  {$EXTERNALSYM LPM_OK}

type
  MSG_TYPE = Integer;
  {$EXTERNALSYM MSG_TYPE}
  TMsgType = MSG_TYPE;

  rsvpmsgobjs = record
    RsvpMsgType: TMsgType;
    pRsvpSession: PRsvpSession;
    pRsvpFromHop: PRsvpHop;
    pRsvpToHop: PRsvpHop;
    pResvStyle: PResvStyle;
    pRsvpScope: PRsvpScope;
    FlowDescCount: Integer;
    pFlowDescs: PFlowDesc;
    PdObjectCount: Integer;
    ppPdObjects: ^PPolicyData;
    pErrorSpec: PErrorSpec;
    pAdspec: PADSpec;
  end;
  {$EXTERNALSYM rsvpmsgobjs}
  RSVP_MSG_OBJS = rsvpmsgobjs;
  {$EXTERNALSYM RSVP_MSG_OBJS}
  TRsvpMsgObjs = RSVP_MSG_OBJS;
  PRsvpMsgObjs = ^RSVP_MSG_OBJS;
  
  PALLOCMEM = function(Size: DWORD): Pointer; stdcall;
  {$EXTERNALSYM PALLOCMEM}
  TAllocMem = PALLOCMEM;

  PFREEMEM = procedure(pv: Pointer); stdcall;
  {$EXTERNALSYM PFREEMEM}
  TFreeMem = PFREEMEM;

  policy_decision = record
    lpvResult: LPV;        // Use the LPV values from above
    wPolicyErrCode: WORD;   // RSVP defined error codes
    wPolicyErrValue: WORD;  // RSVP defined error values
  end;
  {$EXTERNALSYM policy_decision}
  TPolicyDecision = policy_decision;
  PPolicyDecision = ^policy_decision;

  CBADMITRESULT = function(LpmHandle: LPM_HANDLE; RequestHandle: RHANDLE;
    ulPcmActionFlags: ULONG; LpmError: Integer; PolicyDecisionsCount: Integer;
    pPolicyDecisions: PPolicyDecision): ULONG; stdcall;
  {$EXTERNALSYM CBADMITRESULT}
  TCbAdmitResult = CBADMITRESULT;

  CBGETRSVPOBJECTS = function(LpmHandle: LPM_HANDLE; RequestHandle: RHANDLE;
    LpmError: Integer; RsvpObjectsCount: Integer; ppRsvpObjects: PPRsvpObjHdr): ULONG; stdcall;
  {$EXTERNALSYM CBGETRSVPOBJECTS}
  TCbGetRsvpObjects = CBGETRSVPOBJECTS;

// The above 2 call backs can return the following errors

const
  INV_LPM_HANDLE = 1; // Supplied LpmHandle is invalid
  {$EXTERNALSYM INV_LPM_HANDLE}
  LPM_TIME_OUT   = 2; // LPM has returned results after the time limit
  {$EXTERNALSYM LPM_TIME_OUT}
  INV_REQ_HANDLE = 3; // Supplied Request handle is invalid
  {$EXTERNALSYM INV_REQ_HANDLE}
  DUP_RESULTS    = 4; // LPM has already returned results for this request
  {$EXTERNALSYM DUP_RESULTS}
  INV_RESULTS    = 5; // Results supplied are invalid
  {$EXTERNALSYM INV_RESULTS}

type
  lpminitinfo = record
    PcmVersionNumber: DWORD;
    ResultTimeLimit: DWORD;
    ConfiguredLpmCount: Integer;
    AllocMemory: PALLOCMEM;
    FreeMemory: PFREEMEM;
    PcmAdmitResultCallback: CBADMITRESULT;
    GetRsvpObjectsCallback: CBGETRSVPOBJECTS;
  end;
  {$EXTERNALSYM lpminitinfo}
  LPM_INIT_INFO = lpminitinfo;
  {$EXTERNALSYM LPM_INIT_INFO}
  TLpmInitInfo = LPM_INIT_INFO;
  PLpmInitInfo = ^LPM_INIT_INFO;  

// Valid PE types
// XXX ISSUE - Is 0xFFFF a better choice?

const
  LPM_PE_ALL_TYPES = 0;
  {$EXTERNALSYM LPM_PE_ALL_TYPES}

// Current LPM API version number

  LPM_API_VERSION_1 = 1;
  {$EXTERNALSYM LPM_API_VERSION_1}

// Current PCM version number

  PCM_VERSION_1 = 1;
  {$EXTERNALSYM PCM_VERSION_1}

function LPM_Initialize(LpmHandle: LPM_HANDLE; const pLpmInitInfo: LPM_INIT_INFO;
  var pLpmVersionNumber: DWORD; var pSupportedPeType: PETYPE; Reserved: Pointer): ULONG; stdcall;
{$EXTERNALSYM LPM_Initialize}

(**************************************

    LPM_Deinitialize

***************************************)

function LPM_Deinitialize(LpmHandle: LPM_HANDLE): ULONG; stdcall;
{$EXTERNALSYM LPM_Deinitialize}

(**************************************

    LPM_AdmitRsvpMsg

***************************************)

// Valid LPV - LPM Priority Values

const
  LPV_RESERVED     = 0;
  {$EXTERNALSYM LPV_RESERVED}
  LPV_MIN_PRIORITY = 1;
  {$EXTERNALSYM LPV_MIN_PRIORITY}
  LPV_MAX_PRIORITY = $FF00;
  {$EXTERNALSYM LPV_MAX_PRIORITY}
  LPV_DROP_MSG     = $FFFD;
  {$EXTERNALSYM LPV_DROP_MSG}
  LPV_DONT_CARE    = $FFFE;
  {$EXTERNALSYM LPV_DONT_CARE}
  LPV_REJECT       = $FFFF;
  {$EXTERNALSYM LPV_REJECT}

// Valid values for PcmActionFlags

  FORCE_IMMEDIATE_REFRESH = 1;
  {$EXTERNALSYM FORCE_IMMEDIATE_REFRESH}

// Function return values for LPM_AdmitResvMsg

  LPM_RESULT_READY = 0;
  {$EXTERNALSYM LPM_RESULT_READY}
  LPM_RESULT_DEFER = 1;
  {$EXTERNALSYM LPM_RESULT_DEFER}

function LPM_AdmitRsvpMsg(PcmReqHandle: RHANDLE; const pRecvdIntf: RSVP_HOP;
  const pRsvpMsgObjs: RSVP_MSG_OBJS; RcvdRsvpMsgLength: Integer; RcvdRsvpMsg: PUCHAR;
  var pulPcmActionFlags: ULONG; pPolicyDecisions: PPolicyDecision; Reserved: Pointer): ULONG; stdcall;
{$EXTERNALSYM LPM_AdmitRsvpMsg}

(**************************************

    LPM_GetRsvpObjects

***************************************)

// Function return values are defined in LPM_AdmitResvMsg section

function LPM_GetRsvpObjects(PcmReqHandle: RHANDLE; MaxPdSize: ULONG;
  SendingIntfAddr: PRsvpHop; pRsvpMsgObjs: PRsvpMsgObjs; var pRsvpObjectsCount: Integer;
  var pppRsvpObjects: PRsvpObjHdr; Reserved: Pointer): ULONG; stdcall;
{$EXTERNALSYM LPM_GetRsvpObjects}

(**************************************

    LPM_DeleteState

***************************************)

// TearDown reasons

const
  RCVD_PATH_TEAR  = 1;
  {$EXTERNALSYM RCVD_PATH_TEAR}
  RCVD_RESV_TEAR  = 2;
  {$EXTERNALSYM RCVD_RESV_TEAR}
  ADM_CTRL_FAILED = 3;
  {$EXTERNALSYM ADM_CTRL_FAILED}
  STATE_TIMEOUT   = 4;
  {$EXTERNALSYM STATE_TIMEOUT}
  FLOW_DURATION   = 5;
  {$EXTERNALSYM FLOW_DURATION}

procedure LPM_DeleteState(pRcvdIfAddr: PRsvpHop; RsvpMsgType: TMsgType;
  pRsvpSession: PRsvpSession; pRsvpFromHop: PRsvpHop; pResvStyle: PResvStyle;
  FilterSpecCount: Integer; ppFilterSpecList: PFilterSpec; TearDownReason: Integer); stdcall;
{$EXTERNALSYM LPM_DeleteState}

(**************************************

    LPM_IpAddrTable

***************************************)

type
  lpmiptable = record
    ulIfIndex: ULONG;    // SNMP index for this interface
    MediaType: ULONG;    // As defined in IPIFCONS.H
    IfIpAddr: IN_ADDR;   // Interface IP address
    IfNetMask: IN_ADDR;  // Interface subnet mask
  end;
  {$EXTERNALSYM lpmiptable}
  TLpmIpTable = lpmiptable;
  PLpmIpTable = ^lpmiptable;

function LPM_IpAddressTable(cIpAddrTable: ULONG; pIpAddrTable: PLpmIpTable): BOOL; stdcall;
{$EXTERNALSYM LPM_IpAddressTable}

(**************************************

    LPM_CommitResv

***************************************)

// CommitDecision values

const
  RESOURCES_ALLOCATED = 1;
  {$EXTERNALSYM RESOURCES_ALLOCATED}
  RESOURCES_MODIFIED  = 2;
  {$EXTERNALSYM RESOURCES_MODIFIED}

procedure LPM_CommitResv(RsvpSession: PRsvpSession; FlowInstalledIntf: PRsvpHop;
  RsvpStyle: PResvStyle; FilterSpecCount: Integer; ppFilterSpecList: PFilterSpec;
  pMergedFlowSpec: PIsFlowSpec; CommitDecision: ULONG); stdcall;
{$EXTERNALSYM LPM_CommitResv}

implementation

const
  lpmlib = 'msidlpm.dll';

function ObjLength(const x: TRsvpObjHdr): USHORT;
begin
  Result := x.obj_length;
end;

function ObjCType(const x: TRsvpObjHdr): UCHAR;
begin
  Result := x.obj_ctype;
end;

function ObjClass(const x: TRsvpObjHdr): UCHAR;
begin
  Result := x.obj_class;
end;

function ObjData(const x: TRsvpObjHdr): Pointer;
begin
  Result := Pointer(Integer(@x) + SizeOf(x));
end;

function Style_is_Wildcard(p: DWORD): Boolean;
begin
  Result := (p and Opt_SndSel_mask) = Opt_Wildcard;
end;

function Style_is_Shared(p: DWORD): Boolean;
begin
  Result := (p and Opt_Share_mask) = Opt_Shared;
end;

function Error_Usage(x: DWORD): DWORD;
begin
  Result := (x shr 12) and 3;
end;

function Intserv_Version(x: DWORD): DWORD;
begin
  Result := (x and INTSERV_VERS_MASK) shr 4;
end;

function Intserv_Version_OK(const x: TIntServMainHdr): Boolean;
begin
  Result := (x.ismh_version and INTSERV_VERS_MASK) = INTSERV_VERSION0;
end;

function Intserv_Obj_size(const x: TIntServMainHdr): DWORD;
begin
  Result := x.ismh_len32b * 4 + SizeOf(IntServMainHdr) + SizeOf(RsvpObjHdr);
end;

function Issh_len32b(const p: TIntServServiceHdr): USHORT;
begin
  Result := p.issh_len32b;
end;

{$IFDEF DYNAMIC_LINK}

var
  _LPM_Initialize: Pointer;

function LPM_Initialize;
begin
  GetProcedureAddress(_LPM_Initialize, lpmlib, 'LPM_Initialize');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LPM_Initialize]
  end;
end;

var
  _LPM_Deinitialize: Pointer;

function LPM_Deinitialize;
begin
  GetProcedureAddress(_LPM_Deinitialize, lpmlib, 'LPM_Deinitialize');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LPM_Deinitialize]
  end;
end;

var
  _LPM_AdmitRsvpMsg: Pointer;

function LPM_AdmitRsvpMsg;
begin
  GetProcedureAddress(_LPM_AdmitRsvpMsg, lpmlib, 'LPM_AdmitRsvpMsg');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LPM_AdmitRsvpMsg]
  end;
end;

var
  _LPM_GetRsvpObjects: Pointer;

function LPM_GetRsvpObjects;
begin
  GetProcedureAddress(_LPM_GetRsvpObjects, lpmlib, 'LPM_GetRsvpObjects');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LPM_GetRsvpObjects]
  end;
end;

var
  _LPM_DeleteState: Pointer;

procedure LPM_DeleteState;
begin
  GetProcedureAddress(_LPM_DeleteState, lpmlib, 'LPM_DeleteState');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LPM_DeleteState]
  end;
end;

var
  _LPM_IpAddressTable: Pointer;

function LPM_IpAddressTable;
begin
  GetProcedureAddress(_LPM_IpAddressTable, lpmlib, 'LPM_IpAddressTable');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LPM_IpAddressTable]
  end;
end;

var
  _LPM_CommitResv: Pointer;

procedure LPM_CommitResv;
begin
  GetProcedureAddress(_LPM_CommitResv, lpmlib, 'LPM_CommitResv');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_LPM_CommitResv]
  end;
end;

{$ELSE}

function LPM_Initialize; external lpmlib name 'LPM_Initialize';
function LPM_Deinitialize; external lpmlib name 'LPM_Deinitialize';
function LPM_AdmitRsvpMsg; external lpmlib name 'LPM_AdmitRsvpMsg';
function LPM_GetRsvpObjects; external lpmlib name 'LPM_GetRsvpObjects';
procedure LPM_DeleteState; external lpmlib name 'LPM_DeleteState';
function LPM_IpAddressTable; external lpmlib name 'LPM_IpAddressTable';
procedure LPM_CommitResv; external lpmlib name 'LPM_CommitResv';

{$ENDIF DYNAMIC_LINK}

end.
