| /* |
| * |
| * Copyright (C) 2007 Mindspeed Technologies, Inc. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * 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. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| #ifndef __CMM_H__ |
| #define __CMM_H__ |
| |
| #define _GNU_SOURCE |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <errno.h> |
| #include <sys/types.h> |
| #include <sys/socket.h> |
| #include <arpa/inet.h> |
| #include <linux/netlink.h> |
| #include <linux/rtnetlink.h> |
| #include <string.h> |
| #include <fcntl.h> |
| #include <pthread.h> |
| #include <limits.h> |
| |
| #include <libnetfilter_conntrack/libnetfilter_conntrack.h> |
| #include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h> |
| #include <libcli.h> |
| |
| #include <libfci.h> |
| #include "libcmm.h" |
| #ifdef AUTO_BRIDGE |
| #include <auto_bridge.h> |
| #endif |
| #define NEW_IPC 1 |
| |
| #ifdef NEW_IPC |
| typedef cmm_handle_t *daemon_handle_t; |
| #else |
| typedef int daemon_handle_t; |
| #endif |
| |
| #include "forward_engine.h" |
| #include "rtnl.h" |
| #include "pppoe.h" |
| #include "conntrack.h" |
| #include "ffcontrol.h" |
| #include "client_daemon.h" |
| #include "module_rx.h" |
| #include "module_qm.h" |
| #include "module_prf.h" |
| #include "module_vlan.h" |
| #include "module_mcast.h" |
| #include "module_macvlan.h" |
| #include "module_mc4.h" |
| #include "module_mc6.h" |
| #include "timeout.h" |
| #include "module_tunnel.h" |
| #include "module_relay.h" |
| #include "module_stat.h" |
| #include "module_route.h" |
| #include "alt_conf.h" |
| #include "module_expt.h" |
| #include "module_socket.h" |
| #include "module_rtp.h" |
| #include "module_natpt.h" |
| #include "module_pktcap.h" |
| #include "module_icc.h" |
| #include "third_part.h" |
| #ifdef WIFI_ENABLE |
| #include "module_wifi.h" |
| #endif |
| #include "module_l2tp.h" |
| #include "version.h" |
| |
| /***** Defines *****/ |
| |
| //#ifdef COMCERTO_2000 |
| // #define IPSEC_SUPPORT_DISABLED |
| //#endif |
| |
| extern unsigned int nf_conntrack_max ; |
| #define NFNL_SOCK_SIZE (256 * nf_conntrack_max) // ( 1024 * nf_conntrack_max / 4) |
| |
| |
| |
| #define developpers "Mindspeed Technologies <www.mindspeed.com>" |
| #define cmm_help "Usage : cmm [-c command] [-f configurationfile]-h -v \n" \ |
| "-c command \tRun cmm to send a command. Need cmm daemon to be running\n" \ |
| "-f conffile\tTell cmm to use the following configuration file. Available in daemon mode only\n" \ |
| "-h \tPrint this help\n" \ |
| "-v \tPrint cmm version\n" |
| |
| #define cmm_print(level, format, args...) \ |
| do { \ |
| if (level & (DEBUG_CRIT | DEBUG_STDOUT | globalConf.debug_level | globalConf.log_level)) \ |
| cmm_print_func(level, format, ##args); \ |
| } while (0) |
| |
| /* DEBUG_{COMMAND,ERROR,WARNING,INFO} can be set by the user to print out debug messages on |
| * the user console, or from the config file to log debug messages into a log file. |
| * DEBUG_STDOUT messages are not logged into a file. |
| * DEBUG_STDERR messages will be logged into a file if a logfile has been set in the configuration. |
| * Both DEBUG_STDOUT and DEBUG_STDERR messages are printed out on the console or CLI. |
| */ |
| #define DEBUG_COMMAND (1 << 0) |
| #define DEBUG_ERROR (1 << 1) |
| #define DEBUG_WARNING (1 << 2) /* This flag is used when we need to print a message about an unexpected behavior*/ |
| #define DEBUG_INFO (1 << 3) |
| #define DEBUG_STDOUT (1 << 4) /* Used for messages in reply to user actions (display commands, etc) */ |
| #define DEBUG_CRIT (1 << 5) /* Equivalent to DEBUG_STDERR */ |
| #define DEBUG_STDERR DEBUG_CRIT |
| #define DEBUG_NOTIMESTAMP (1 << 7) |
| |
| /* This debug is not controlled via CLI */ |
| #define IPSEC_DBG |
| |
| //#define MUTEX_DEBUG |
| |
| #ifdef MUTEX_DEBUG |
| |
| extern pthread_mutex_t ctMutex; |
| extern pthread_mutex_t rtMutex; |
| extern pthread_mutex_t neighMutex; |
| extern pthread_mutex_t flowMutex; |
| |
| int mutexes; |
| #define __pthread_mutex_lock(mutex) \ |
| ({ \ |
| if (mutex == &ctMutex) mutexes |= 0x1; \ |
| else if (mutex == &rtMutex) mutexes |= 0x10; \ |
| else if (mutex == &neighMutex) mutexes |= 0x100; \ |
| else if (mutex == &flowMutex) mutexes |= 0x1000; \ |
| cmm_print(DEBUG_CRIT, "0x%04x: lock at %s %u\n", mutexes, __func__, __LINE__); \ |
| pthread_mutex_lock (mutex); \ |
| }) |
| #define __pthread_mutex_unlock(mutex) \ |
| ({ \ |
| if (mutex == &ctMutex) mutexes &= ~0x1; \ |
| else if (mutex == &rtMutex) mutexes &= ~0x10; \ |
| else if (mutex == &neighMutex) mutexes &= ~0x100; \ |
| else if (mutex == &flowMutex) mutexes &= ~0x1000; \ |
| cmm_print(DEBUG_CRIT, "0x%04x: unlock at %s %u\n", mutexes, __func__, __LINE__); \ |
| pthread_mutex_unlock (mutex); \ |
| }) |
| |
| #else |
| #define __pthread_mutex_lock pthread_mutex_lock |
| #define __pthread_mutex_unlock pthread_mutex_unlock |
| #endif |
| |
| |
| /* This macro is used for PPPoE Auto mode */ |
| #define PPPOE_AUTO_ENABLE 0 |
| |
| |
| |
| #define CMM_PID_FILE_PATH "/var/run/cmm.pid" |
| |
| /* The following define is enabled if 3rd party callback support is required */ |
| //#define CMM_THIRD_PART |
| |
| struct cmm_ct { |
| pthread_t pthread; |
| |
| FCI_CLIENT *fci_handle; |
| FCI_CLIENT *fci_catch_handle; |
| |
| FCI_CLIENT *fci_key_handle; |
| FCI_CLIENT *fci_key_catch_handle; |
| |
| struct nfct_handle *handle; |
| struct nfct_handle *catch_handle; |
| struct nfct_handle *get_handle; |
| |
| struct rtnl_handle rth_neigh; |
| struct rtnl_handle rth_link; |
| struct rtnl_handle rth_ifaddr; |
| struct rtnl_handle rth_route; |
| struct rtnl_handle rth_rule; |
| struct rtnl_handle rth_abm; |
| }; |
| |
| struct cmm_daemon { |
| pthread_t pthread; |
| FCI_CLIENT *fci_handle; /* fci library Handler used by msg daemon thread*/ |
| FCI_CLIENT *fci_key_handle; |
| int queueIdRx; |
| int queueIdTx; |
| }; |
| |
| struct cmm_cli { |
| pthread_t pthread; |
| FCI_CLIENT *fci_handle; |
| daemon_handle_t daemon_handle; |
| int sock; |
| int sock2; |
| struct cli_def *handle; |
| }; |
| |
| /***** Global structure *****/ |
| struct cmm_global |
| { |
| pid_t cmmPid; |
| FILE *logFile; |
| pthread_mutex_t logMutex; |
| |
| int enable; /*Forward engine can be programmed or not*/ |
| |
| int ff_enable; /* Fast-forward enable/disable, all packets go through ACP but all control path is enabled */ |
| #ifdef C2000_DPI |
| int dpi_enable; /* DPI enable/disable, CMM pushes connections to FPP normally if disabled */ |
| #endif |
| int asymff_enable; /* Asymmetric Fastpath enable/disable*/ |
| char debug_level; |
| char log_level; |
| enum _t_vlan_policy { |
| ALLOW, |
| PROHIBIT, |
| MANUAL |
| } vlan_policy; |
| |
| char tun_family; |
| char tun_proto; |
| |
| struct nfct_handle *nf_conntrack_handle; /* Used to send messages to nf_conntrack -- use must be protected by ctMutex */ |
| |
| struct cmm_ct ct; |
| struct cmm_daemon daemon; |
| struct cmm_cli cli; |
| |
| int *third_part_data; |
| int auto_bridge; |
| }; |
| |
| /* |
| * This structure is used to exchange messages |
| * between cmm daemon and cmm client |
| */ |
| struct cmm_msg |
| { |
| long mtype; // This field is mandatory to use IPC message queues |
| char buffer[CMM_BUF_SIZE]; // A buffer where the data are stored |
| }; |
| /* |
| * Common parser defines/helpers |
| */ |
| #define CMD_BIT(x) (1 << ((x) & 0xFF)) |
| #define TEST_CMD_BIT(y, x) (y & (CMD_BIT(x))) |
| |
| extern struct cmm_global globalConf; |
| |
| int cmmIsDaemonRunning(void); |
| void cmm_print_func(int level, const char *format, ...); |
| |
| #define MAC_ADDRSTRLEN 18 |
| const char *mac_ntop(const void *mac, char *buf, size_t len); |
| #endif |