/******************************************************************
 * Copyright (c) 2013-2015,2017, 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

