/* 
 *  OpenGGSN - Gateway GPRS Support Node
 *  Copyright (C) 2002 Mondru AB.
 * 
 *  The contents of this file may be used under the terms of the GNU
 *  General Public License Version 2, provided that the above copyright
 *  notice and this permission notice is included in all copies or
 *  substantial portions of the software.
 * 
 *  The initial developer of the original code is
 *  Jens Jakobsen <jj@openggsn.org>
 * 
 *  Contributor(s):
 * 
 */

#ifndef _GTP_H
#define _GTP_H

#define GTP_DEBUG 0              /* Print debug information */

#define GTP_MODE_GGSN 1
#define GTP_MODE_SGSN 2

#define GTP0_PORT	3386
#define GTP1C_PORT	2123
#define GTP1U_PORT	2152
#define PACKET_MAX      8196

#define GTP_MAX  0xffff         /* TODO: Choose right number */
#define GTP0_HEADER_SIZE 20
#define GTP1_HEADER_SIZE_SHORT  8
#define GTP1_HEADER_SIZE_LONG  12

#define SYSLOG_PRINTSIZE 255
#define ERRMSG_SIZE 255

#define RESTART_FILE "gsn_restart"
#define NAMESIZE 1024

/* GTP version 1 message type definitions. Also covers version 0 except *
 * for anonymous PDP context which was superceded in version 1 */

/* 0 For future use. */
#define GTP_ECHO_REQ          1 /* Echo Request */
#define GTP_ECHO_RSP          2 /* Echo Response */
#define GTP_NOT_SUPPORTED     3 /* Version Not Supported */
#define GTP_ALIVE_REQ         4 /* Node Alive Request */
#define GTP_ALIVE_RSP         5 /* Node Alive Response */
#define GTP_REDIR_REQ         6 /* Redirection Request */
#define GTP_REDIR_RSP         7 /* Redirection Response */
/* 8-15 For future use. */
#define GTP_CREATE_PDP_REQ   16 /* Create PDP Context Request */
#define GTP_CREATE_PDP_RSP   17 /* Create PDP Context Response */
#define GTP_UPDATE_PDP_REQ   18 /* Update PDP Context Request */
#define GTP_UPDATE_PDP_RSP   19 /* Update PDP Context Response */
#define GTP_DELETE_PDP_REQ   20 /* Delete PDP Context Request */
#define GTP_DELETE_PDP_RSP   21 /* Delete PDP Context Response */
/* 22-25 For future use. */ /* In version GTP 1 anonomous PDP context */
#define GTP_ERROR            26 /* Error Indication */
#define GTP_PDU_NOT_REQ      27 /* PDU Notification Request */
#define GTP_PDU_NOT_RSP      28 /* PDU Notification Response */
#define GTP_PDU_NOT_REJ_REQ  29 /* PDU Notification Reject Request */
#define GTP_PDU_NOT_REJ_RSP  30 /* PDU Notification Reject Response */
#define GTP_SUPP_EXT_HEADER  31 /* Supported Extension Headers Notification */
#define GTP_SND_ROUTE_REQ    32 /* Send Routeing Information for GPRS Request */
#define GTP_SND_ROUTE_RSP    33 /* Send Routeing Information for GPRS Response */
#define GTP_FAILURE_REQ      34 /* Failure Report Request */
#define GTP_FAILURE_RSP      35 /* Failure Report Response */
#define GTP_MS_PRESENT_REQ   36 /* Note MS GPRS Present Request */
#define GTP_MS_PRESENT_RSP   37 /* Note MS GPRS Present Response */
/* 38-47 For future use. */ 
#define GTP_IDEN_REQ         48 /* Identification Request */
#define GTP_IDEN_RSP         49 /* Identification Response */
#define GTP_SGSN_CONTEXT_REQ 50 /* SGSN Context Request */
#define GTP_SGSN_CONTEXT_RSP 51 /* SGSN Context Response */
#define GTP_SGSN_CONTEXT_ACK 52 /* SGSN Context Acknowledge */
#define GTP_FWD_RELOC_REQ    53 /* Forward Relocation Request */
#define GTP_FWD_RELOC_RSP    54 /* Forward Relocation Response */
#define GTP_FWD_RELOC_COMPL  55 /* Forward Relocation Complete */
#define GTP_RELOC_CANCEL_REQ 56 /* Relocation Cancel Request */
#define GTP_RELOC_CANCEL_RSP 57 /* Relocation Cancel Response */
#define GTP_FWD_SRNS         58 /* Forward SRNS Context */
#define GTP_FWD_RELOC_ACK    59 /* Forward Relocation Complete Acknowledge */
#define GTP_FWD_SRNS_ACK     60 /* Forward SRNS Context Acknowledge */
/* 61-239 For future use. */
#define GTP_DATA_TRAN_REQ   240 /* Data Record Transfer Request */
#define GTP_DATA_TRAN_RSP   241 /* Data Record Transfer Response */
/* 242-254 For future use. */
#define GTP_GPDU            255 /* G-PDU */

/* GTP 0 header. 
 * Explanation to some of the fields:
 * SNDCP NPDU Number flag = 0 except for inter SGSN handover situations
 * SNDCP N-PDU LCC Number 0 = 0xff except for inter SGSN handover situations
 * Sequence number. Used for reliable delivery of signalling messages, and
 *   to discard "illegal" data messages.
 * Flow label. Is used to point a particular PDP context. Is used in data
 *   messages as well as signalling messages related to a particular context.
 * Tunnel ID is IMSI+NSAPI. Unique identifier of PDP context. Is somewhat
 *   redundant because the header also includes flow. */

struct gtp0_header {            /*    Descriptions from 3GPP 09.60 */
	u_int8_t  flags;        /* 01 bitfield, with typical values */
                                /*    000..... Version: 1 (0) */
                                /*    ...1111. Spare (7) */
                                /*    .......0 SNDCP N-PDU Number flag (0) */
	u_int8_t  type;	        /* 02 Message type. T-PDU = 0xff */
	u_int16_t length;	/* 03 Length (of G-PDU excluding header) */
	u_int16_t seq;	        /* 05 Sequence Number */
	u_int16_t flow;	        /* 07 Flow Label ( = 0 for signalling) */
	u_int8_t  number;	/* 09 SNDCP N-PDU LCC Number ( 0 = 0xff) */
	u_int8_t  spare1;	/* 10 Spare */
	u_int8_t  spare2;	/* 11 Spare */
	u_int8_t  spare3;	/* 12 Spare */
	u_int64_t tid;		/* 13 Tunnel ID */
};                              /* 20 */

struct gtp1_header_short {      /*     Descriptions from 3GPP 29060 */
	u_int8_t  flags;        /* 01 bitfield, with typical values */
                                /*    000..... Version: 1 */
                                /*    ...1.... Protocol Type: GTP=1, GTP'=0 */
                                /*    ....1... Spare = 1 */
                                /*    .....1.. Extension header flag: 1 */
                                /*    ......1. Sequence number flag: 1 */
                                /*    .......0 PN: N-PDU Number flag */
	u_int8_t  type;		/* 02 Message type. T-PDU = 0xff */
	u_int16_t length;	/* 03 Length (of IP packet or signalling) */
	u_int64_t tid;		/* 05 - 08 Tunnel ID */
};

struct gtp1_header_long {       /*     Descriptions from 3GPP 29060 */
	u_int8_t  flags;        /* 01 bitfield, with typical values */
                                /*    000..... Version: 1 */
                                /*    ...1.... Protocol Type: GTP=1, GTP'=0 */
                                /*    ....1... Spare = 1 */
                                /*    .....1.. Extension header flag: 1 */
                                /*    ......1. Sequence number flag: 1 */
                                /*    .......0 PN: N-PDU Number flag */
	u_int8_t  type;		/* 02 Message type. T-PDU = 0xff */
	u_int16_t length;	/* 03 Length (of IP packet or signalling) */
	u_int64_t tid;		/* 05 Tunnel ID */
	u_int16_t seq;	        /* 10 Sequence Number */
	u_int8_t  npdu;		/* 11 N-PDU Number */
	u_int8_t  next;		/* 12 Next extension header type. Empty = 0 */
};

struct gtp0_packet {
  struct gtp0_header h;
  u_int8_t p[GTP_MAX];
} __attribute__((packed));

struct gtp1_packet_short {
  struct gtp1_header_short h;
  u_int8_t p[GTP_MAX];
} __attribute__((packed));

struct gtp1_packet_long {
  struct gtp1_header_long h;
  u_int8_t p[GTP_MAX];
} __attribute__((packed));

union gtp_packet {
  u_int8_t flags;
  struct gtp0_packet       gtp0;
  struct gtp1_packet_short gtp1s;
  struct gtp1_packet_long  gtp1l;
} __attribute__((packed)) h;




/* ***********************************************************
 * Information storage for each gsn instance
 *
 * Normally each instance of the application corresponds to
 * one instance of a gsn. 
 * 
 * In order to avoid global variables in the application, and
 * also in order to allow several instances of a gsn in the same
 * application this struct is provided in order to store all
 * relevant information related to the gsn.
 * 
 * Note that this does not include information storage for '
 * each pdp context. This is stored in another struct.
 *************************************************************/

struct gsn_t {
  /* Parameters related to the network interface */

  int         fd;       /* File descriptor to network interface */
  int       mode;       /* Mode of operation: GGSN or SGSN */
  struct in_addr gsnc;  /* IP address of this gsn for signalling */
  struct in_addr gsnu;  /* IP address of this gsn for user traffic */

  /* Parameters related to signalling messages */
  uint16_t seq_next;    /* Next sequence number to use */
  int seq_first;        /* First packet in queue (oldest timeout) */
  int seq_last;         /* Last packet in queue (youngest timeout) */

  unsigned char restart_counter; /* Increment on restart. Stored on disk */
  char *statedir;       /* Disk location for permanent storage */

  struct queue_t *queue_req;  /* Request queue */
  struct queue_t *queue_resp; /* Response queue */

  /* Call back functions */
  int (*cb_delete_context) (struct pdp_t*);
  int (*cb_create_context) (struct pdp_t*);
  int (*cb_conf) (int type, int cause, struct pdp_t *pdp, void* aid);
  int (*cb_gpdu) (struct pdp_t* pdp, void* pack, unsigned len);

  /* Counters */
  
  uint64_t err_socket;      /* Number of socket errors */
  uint64_t err_readfrom;    /* Number of readfrom errors */
  uint64_t err_sendto;      /* Number of sendto errors */
  uint64_t err_memcpy;      /* Number of memcpy */
  uint64_t err_queuefull;   /* Number of times queue was full */
  uint64_t err_seq;         /* Number of seq out of range */
  uint64_t err_address;     /* GSN address conversion failed */
  uint64_t err_unknownpdp;  /* GSN address conversion failed */
  uint64_t err_unknowntid;  /* Application supplied unknown imsi+nsapi */
  uint64_t err_cause;       /* Unexpected cause value received */
  uint64_t err_outofpdp;    /* Out of storage for PDP contexts */

  uint64_t empty;       /* Number of empty packets */
  uint64_t unsup;       /* Number of unsupported version 29.60 11.1.1 */
  uint64_t tooshort;    /* Number of too short headers 29.60 11.1.2 */
  uint64_t unknown;     /* Number of unknown messages 29.60 11.1.3 */
  uint64_t unexpect;    /* Number of unexpected messages 29.60 11.1.4 */
  uint64_t dublicate;   /* Number of dublicate or unsolicited replies */
  uint64_t missing;     /* Number of missing mandatory field messages */
  uint64_t invalid;     /* Number of invalid message format messages */
};


/* External API functions */

extern const char* gtp_version();
extern int gtp_new(struct gsn_t **gsn, char *statedir, struct in_addr *listen,
		   int mode);

extern int gtp_free(struct gsn_t *gsn);

extern int gtp_newpdp(struct gsn_t *gsn, struct pdp_t **pdp,
		      uint64_t imsi, uint8_t nsapi);
extern int gtp_freepdp(struct gsn_t *gsn, struct pdp_t *pdp);

extern int gtp_create_context(struct gsn_t *gsn, struct pdp_t *pdp, void *aid,
			      struct in_addr* inetaddr);
extern int gtp_update_context(struct gsn_t *gsn, struct pdp_t *pdp, void *aid,
			      struct in_addr* inetaddr);
extern int gtp_delete_context(struct gsn_t *gsn, struct pdp_t *pdp, void *aid);

extern int 
gtp_create_context2(struct gsn_t *gsn, void *aid, 
		    struct in_addr* inetaddr,
		    int selmode, uint64_t imsi, int nsapi,
		    uint8_t *qos, int qoslen,
		    char *apn, int apnlen,
		    char *msisdn, int msisdnlen,
		    uint8_t *pco, int pcolen);

extern int gtp_gpdu(struct gsn_t *gsn, struct pdp_t *pdp,
		    void *pack, unsigned len);

extern int gtp_fd(struct gsn_t *gsn);
extern int gtp_decaps(struct gsn_t *gsn);
extern int gtp_retrans(struct gsn_t *gsn);
extern int gtp_retranstimeout(struct gsn_t *gsn, struct timeval *timeout);

/*
extern int gtp_set_cb_newpdp(struct gsn_t *gsn, 
			     int (*cb) (struct pdp_t*));
extern int gtp_set_cb_freepdp(struct gsn_t *gsn, 
			      int (*cb) (struct pdp_t*));
extern int gtp_set_cb_create_pdp_ind(struct gsn_t *gsn, 
				     int (*cb) (struct pdp_t*));
extern int gtp_set_cb_create_pdp_conf(struct gsn_t *gsn, 
				      int (*cb) (struct pdp_t*, int));
extern int gtp_set_cb_update_pdp_conf(struct gsn_t *gsn, 
				      int (*cb) (struct pdp_t*, int, int));
extern int gtp_set_cb_delete_pdp_ind(struct gsn_t *gsn, 
				     int (*cb) (struct pdp_t*));
extern int gtp_set_cb_delete_pdp_conf(struct gsn_t *gsn, 
				      int (*cb) (struct pdp_t*, int));
*/

extern int gtp_set_cb_delete_context(struct gsn_t *gsn, 
	     int (*cb_delete_context) (struct pdp_t* pdp));
extern int gtp_set_cb_create_context(struct gsn_t *gsn,
	     int (*cb_create_context) (struct pdp_t* pdp));
extern int gtp_set_cb_conf(struct gsn_t *gsn,
             int (*cb) (int type, int cause, struct pdp_t* pdp, void *aid));
extern int gtp_set_cb_gpdu(struct gsn_t *gsn,
	     int (*cb_gpdu) (struct pdp_t* pdp, void* pack, unsigned len));


/* Internal functions (not part of the API */

extern int gtp_echo_req(struct gsn_t *gsn, struct in_addr *inetaddrs);
extern int gtp_echo_resp(struct gsn_t *gsn, struct sockaddr_in *peer,
			 void *pack, unsigned len);
extern int gtp_echo_ind(struct gsn_t *gsn, struct sockaddr_in *peer,
			void *pack, unsigned len);
extern int gtp_echo_conf(struct gsn_t *gsn, struct sockaddr_in *peer,
			 void *pack, unsigned len);

extern int gtp_unsup_resp(struct gsn_t *gsn, struct sockaddr_in *peer,
			  void *pack, unsigned len);
extern int gtp_unsup_conf(struct gsn_t *gsn, struct sockaddr_in *peer,
			  void *pack, unsigned len);

extern int gtp_create_pdp_req(struct gsn_t *gsn, int version, void *aid,
			      struct in_addr* inetaddr, struct pdp_t *pdp);

extern int gtp_create_pdp_resp(struct gsn_t *gsn, int version,
			       struct sockaddr_in *peer, 
			       void *pack, unsigned len, 
			       struct pdp_t *pdp, uint8_t cause);

extern int gtp_create_pdp_ind(struct gsn_t *gsn, int version,
			      struct sockaddr_in *peer, 
			      void *pack, unsigned len);

extern int gtp_create_pdp_conf(struct gsn_t *gsn, int version,
			       struct sockaddr_in *peer,
			       void *pack, unsigned len);

extern int gtp_update_pdp_req(struct gsn_t *gsn, int version, void *aid,
			      struct in_addr* inetaddr, struct pdp_t *pdp);

extern int gtp_delete_pdp_req(struct gsn_t *gsn, int version, void *aid,
			      struct pdp_t *pdp);

extern int gtp_delete_pdp_resp(struct gsn_t *gsn, int version,
			       struct sockaddr_in *peer, 
			       void *pack, unsigned len, 
			       struct pdp_t *pdp, uint8_t cause);

extern int gtp_delete_pdp_ind(struct gsn_t *gsn, int version,
			      struct sockaddr_in *peer, 
			      void *pack, unsigned len);

extern int gtp_delete_pdp_conf(struct gsn_t *gsn, int version,
			       struct sockaddr_in *peer,
			       void *pack, unsigned len);


extern int ipv42eua(struct ul66_t *eua, struct in_addr *src);
extern int eua2ipv4(struct in_addr *dst, struct ul66_t *eua);
extern int gsna2in_addr(struct in_addr *dst, struct ul16_t *gsna);
extern int in_addr2gsna(struct ul16_t *gsna, struct in_addr *src);

#endif	/* !_GTP_H */
