blob: c8248ce66969567d40f235debc22238313419194 [file] [log] [blame]
/******************************************************************
* 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