/*-
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Copyright (c) 2018 Chelsio Communications, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 */

#ifndef	__tcb_common_h
#define	__tcb_common_h

/* ANSI C standard includes */
#include        <assert.h>
#include        <stdlib.h>
#include        <string.h>
#include        <ctype.h>
#include        <stdio.h>
#include        <stdarg.h>


#ifndef FALSE
#define FALSE 0
#endif

#ifndef EOS
#define EOS  '\0'
#endif

#ifndef __variable_sizes

/* windows has _UI64_MAX.  C99 has ULLONG_MAX, but I don't compile
with C99 for portability with windows, so the ui64 is a guess.
I'll add an assert to cl_main to confirm these sizes are accurate.
*/
#ifdef _UI64_MAX   /* windows */
#if   (_UI64_MAX ==  0xFFFFFFFFFFFFFFFF)
typedef __int64                      si64;
typedef unsigned __int64             ui64;
#endif
#else  /*else of #ifdef _UI64_MAX */
typedef long long int                si64;
typedef unsigned long long int       ui64;
#endif /*endif of #ifdef _UI64_MAX */
#endif /* endif of #ifndef __variable_sizes */




typedef struct tcb_var {
  char *name;
  int   aux;
  int   lo;
  int   hi;

  char *faka;
  int  flo;
  int  fhi;

  char *aka;

  int   comp;

  char *desc;
  char *akadesc;
  
  ui64 rawval;  
  unsigned val;

} _TCBVAR;


enum comp_types {

  COMP_NONE=0,
  COMP_ULP,
  COMP_TX_MAX,
  COMP_RCV_NXT,
  COMP_PTR,
  COMP_LEN,

};


enum tidtypes {
  TIDTYPE_TCB=0,
  TIDTYPE_SCB=1,
  TIDTYPE_FCB=2,

};


enum prntstyls {
  PRNTSTYL_VERBOSE=0,
  PRNTSTYL_LIST=1,
  PRNTSTYL_COMP=2,
  PRNTSTYL_RAW=3,

};


/* from tp/src/tp.h */
#define PM_MODE_PASS  0
#define PM_MODE_DDP   1
#define PM_MODE_ISCSI 2
#define PM_MODE_IWARP 3
#define PM_MODE_RDDP  4
#define PM_MODE_IANDP 5
#define PM_MODE_FCOE  6
#define PM_MODE_USER  7
#define PM_MODE_TLS   8
#define PM_MODE_DTLS  9



#define SEQ_ADD(a,b)    (((a)+(b)) & 0xFFFFFFFF)
#define SEQ_SUB(a,b)    (((a)-(b)) & 0xFFFFFFFF)

///* functions needed by the tcbshowtN.c code */
extern unsigned val(char *name);
extern ui64 val64(char *name);
extern void PR(char *fmt, ...);
extern char *spr_tcp_state(unsigned state);
extern char *spr_ip_version(unsigned ipver);
extern char *spr_cctrl_sel(unsigned cctrl_sel0,unsigned cctrl_sel1);
extern char *spr_ulp_type(unsigned ulp_type);


extern unsigned parse_tcb( _TCBVAR *base_tvp, unsigned char *buf);
extern void display_tcb(_TCBVAR *tvp,unsigned char *buf,int aux);
extern void parse_n_display_xcb(unsigned char *buf);

extern void swizzle_tcb(unsigned char *buf);
extern void  set_tidtype(unsigned int tidtype);
extern void set_tcb_info(unsigned int tidtype, unsigned int cardtype);
extern void set_print_style(unsigned int prntstyl);

#endif /* __tcb_common_h */
