/******************************************************************
 * Copyright (c) 2013-2015,2017, 2018 The Linux Foundation. All rights reserved.

 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.

 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *---------------------------------------------------------------

 * DESCRIPTION
 * Header file for eMBMs Tunneling Module in kernel.
 *******************************************************************
 */

#ifndef EMBMS_H
#define EMBMS_H

#include <linux/ioctl.h>
#include <stdbool.h>
#include <linux/if_addr.h>
#include <linux/list.h>
#include <linux/ip.h>
#include <linux/miscdevice.h>
#include <linux/spinlock.h>
#include <linux/cdev.h>

#define EMBMS_MAX_IFACE_NAME    20

/* Defining IP and UDP header related macros*/

#define UDP_CHECKSUM                0
#define IP_VERSION                  4
#define IP_IHL                      5
#define IP_TOS                      0
#define IP_ID                       1
#define IP_FRAG_OFFSET              htons(0x4000)
#define IP_TTL                      64
#define BRIDGE_IFACE                "bridge0"

#define BUF_LEN 1024
#define TUNNELING_ON 1
#define TUNNELING_OFF 0

// definitions required for IOCTL
static unsigned int dev_num = 1;
/* Embms device used for communication*/
struct cdev embms_device;
static struct class *embms_class;
static dev_t device;
#define EMBMS_IOC_MAGIC 0x64

#define embms_debug pr_debug
#define embms_error pr_debug

/* The name of the device file*/
#define EMBMS_DEVICE_NAME "embms_tm_device"

extern int (*embms_tm_multicast_recv)(struct sk_buff *skb);

/**
 * enum embms_action_type - Describes action to perform
 * @ADD_CLIENT_ENTRY: add client entry to TMGI
 * @DELETE_CLIENT_ENTRY: deelte client entry from TMGI
 * @TMGI_DEACTIVATE: Delete TMGI entry
 * @CLIENT_ACTIVATE_ALL_TMGI: Add client to all TMGI
 * @CLIENT_DEACTIVATE_ALL_TMGI: Delete client from all TMGI
 * @SESSION_DEACTIVATE: Stop session
 * @SOCK_INFO: Socket information like V4 addr, port etc
 *
 * This enum defines the types of action which are
 * supported by this module.
 */

enum {
	ADD_CLIENT_ENTRY = 0,
	DELETE_CLIENT_ENTRY,
	TMGI_DEACTIVATE,
	CLIENT_ACTIVATE_ALL_TMGI,
	CLIENT_DEACTIVATE_ALL_TMGI,
	SESSION_DEACTIVATE,
	SOCK_INFO
} embms_action_type;

/**
 * struct tmgi_to_clnt_info_update - information for addition/deletion
 * @multicast_addr: TMGI multicast IP to receive data
 * @multicast_port: TMGI multicast port to receive date
 * @client_addr: Client IPV4 address for sending data
 * @client_port: Client port for sending data
 * @data_port: port used to send data to client
 * @action_type: Action to be performed
 * @iface_name: iface to listen to for data
 *
 * This structure contains information as to what action
 * needs to be performed on TMGI-client table. It is
 * sent as a parameter during an IOCTL call
 */

struct tmgi_to_clnt_info_update {
	u32 multicast_addr;
	u16 multicast_port;
	u32 client_addr;
	u16 client_port;
	u16 data_port;
	u32 action_type;
	char iface_name[EMBMS_MAX_IFACE_NAME];
};

/**
 * struct clnt_info - contains client information
 * @addr: Client IPV4 address for sending packets
 * @port: Client port for sending packets
 * @dmac: Client DMAC address
 * @client_list_ptr : list ptr used to maintain client list
 *
 * This structure maintains complete client information
 * to be used when sending packets to client
 */

struct clnt_info {
	u32 addr;
	u16 port;
	u8 dmac[ETH_ALEN];
	struct list_head client_list_ptr;
};

/**
 * struct tmgi_to_clnt_info - contains TMGI information
 * @tmgi_multicast_addr: TMGI IPV4 address to listen for packets
 * @tmgi_port: Client port to listen for packets
 * @no_of_clients: No of clients for a TMGI
 * @client_list_head : list head for client list
 * @tmgi_list_ptr : list ptr to maintain tmgi list
 *
 * This structure maintains complete client information
 * to be used when sending data to client
 */

struct tmgi_to_clnt_info {
	u32 tmgi_multicast_addr;
	u16 tmgi_port;
	u16 no_of_clients;
	struct list_head client_list_head;
	struct list_head tmgi_list_ptr;
};

/**
 * struct embms_info_internal - stores module specific params
 * @device_under_use: Used to prevent concurent access to the same device
 * @embms_data_port: Source Data port used for tunnelled packets
 * @embms_iface: Iface to receive embms traffic
 * @embms_tunneling_status : Current EMBMS Status
 * @no_of_tmgi_sessions : Number of current active TMGI sessions
 * @lock : Lock for concurrency scenarios
 * @ip_ident : IP identification number to be used for sent packets
 *
 * This tructure holds module specific information which is
 * used throughout the module to maintain consistency
 */

struct embms_info_internal {
	atomic_t device_under_use;
	int embms_data_port;
	char embms_iface[EMBMS_MAX_IFACE_NAME];
	int embms_tunneling_status;
	int no_of_tmgi_sessions;
	/*lock to prevent concurrent access*/
	spinlock_t lock;
	atomic_t ip_ident;
};

/* This ioctl is used to add a new client entry to tunneling module.
 * Entry params are populated in the struct used for ioctl
 */

#define ADD_EMBMS_TUNNEL _IOW(EMBMS_IOC_MAGIC, 0, \
		struct tmgi_to_clnt_info_update)

/* This ioctl is used to delete a client entry for a particular
 * TMGI from tunneling module.
 * Entry params are populated in the struct used for ioctl
 */

#define DEL_EMBMS_TUNNEL _IOW(EMBMS_IOC_MAGIC, 1, \
		struct tmgi_to_clnt_info_update)

/* This ioctl is used to delete a TMGI entry completely
 * from tunneling module.
 * Entry params are populated in the struct used for ioctl
 */

#define TMGI_DEACTIVATE _IOW(EMBMS_IOC_MAGIC, 2, \
		struct tmgi_to_clnt_info_update)

/* This ioctl is used to delete client entry completely
 * from tunneling module.
 * Entry params are populated in the struct used for ioctl
 */

#define CLIENT_DEACTIVATE _IOW(EMBMS_IOC_MAGIC, 3, \
		struct tmgi_to_clnt_info_update)

/* Gets the ON/OFF status of Tunneling module*/

#define GET_EMBMS_TUNNELING_STATUS _IO(EMBMS_IOC_MAGIC, 4)

/* Used to start tunneling. Argument is the port
 * number to be used to send
 * data to clients
 */

#define START_EMBMS_TUNNEL _IOW(EMBMS_IOC_MAGIC, 5, \
		struct tmgi_to_clnt_info_update)

/* Used to stop tunnleing*/

#define STOP_EMBMS_TUNNEL _IO(EMBMS_IOC_MAGIC, 6)

/* Return values indicating error status*/
#define SUCCESS               0         /* Successful operation*/
#define FAILURE               -1         /* Unsuccessful operation*/

/* Error Condition Values*/
#define ENOMEM                -2        /* Out of memory*/
#define EBADPARAM             -3        /* Incorrect parameters passed*/
#define ENOEFFECT             -4        /* No Effect*/

#endif

