OCT
REM: 1. 增加PPPoE用户自动拨号,以及状态机功能 2. 优化rawif网卡接收数据包,对非业务信息进行过滤 3. 增加网卡名称,是否支持vxlan等配置项 4. 重构pppoeif接口初始化逻辑以及参数
This commit is contained in:
parent
33449cac5d
commit
757b3f1bb7
|
@ -0,0 +1,72 @@
|
||||||
|
//
|
||||||
|
// Created by xajhuang on 2022/5/31.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef VCPE_PROJECT_PPPOE_INFO_H
|
||||||
|
#define VCPE_PROJECT_PPPOE_INFO_H
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
#include <uthash/uthash.h>
|
||||||
|
#include "netif/ppp/ppp.h"
|
||||||
|
|
||||||
|
#define PPPOE_MAX_TIMEOUT (30)
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
STATUS_TASK_INIT,
|
||||||
|
STATUS_TASK_DIAL,
|
||||||
|
STATUS_TASK_CONNECTED,
|
||||||
|
STATUS_TASK_ERROR,
|
||||||
|
STATUS_TASK_DISCONNECTED,
|
||||||
|
STATUS_TASK_DELETE,
|
||||||
|
STATUS_PPPOE_UPDATE,
|
||||||
|
} PPPOE_TASK;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
STATUS_USER_NEW,
|
||||||
|
STATUS_USER_DELETE,
|
||||||
|
STATUS_USER_MODIFY,
|
||||||
|
STATUS_USER_NORMAL,
|
||||||
|
} USER_STATUS;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned int timeout;
|
||||||
|
unsigned int count;
|
||||||
|
} RETRY_WORK;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned int userid;
|
||||||
|
struct netif *nicif;
|
||||||
|
struct netif *pppif;
|
||||||
|
ppp_pcb *ppp;
|
||||||
|
|
||||||
|
RETRY_WORK retry;
|
||||||
|
|
||||||
|
PPPOE_TASK status;
|
||||||
|
} PPPOE_SESSION, *PPPPOE_SESSION;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned short qinq_tag1;
|
||||||
|
unsigned short qinq_tag2;
|
||||||
|
unsigned char mac_addr[6];
|
||||||
|
const char *pppoe_user;
|
||||||
|
const char *pppoe_passwd;
|
||||||
|
USER_STATUS user_status;
|
||||||
|
} USER_INFO, *PUSER_INFO;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned int userid;
|
||||||
|
USER_INFO user_info;
|
||||||
|
PPPOE_SESSION session;
|
||||||
|
|
||||||
|
UT_hash_handle hh;
|
||||||
|
} USER_INFO_CONTEXT, *PUSER_INFO_CONTEXT;
|
||||||
|
|
||||||
|
int pppoe_session_create(PUSER_INFO_CONTEXT pUser);
|
||||||
|
int pppoe_session_init();
|
||||||
|
struct netif *get_rawsocket_if(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif//VCPE_PROJECT_PPPOE_INFO_H
|
|
@ -13,17 +13,9 @@ extern "C" {
|
||||||
|
|
||||||
#include "user_info.h"
|
#include "user_info.h"
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int userid;
|
|
||||||
struct netif *nicif;
|
|
||||||
struct netif *pppif;
|
|
||||||
USER_INFO user_info;
|
|
||||||
|
|
||||||
UT_hash_handle hh;
|
|
||||||
} PPPOE_SESSION, *PPPPOE_SESSION;
|
|
||||||
|
|
||||||
int pppoe_session_init();
|
|
||||||
struct netif* get_rawsocket_if(void);
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -7,29 +7,17 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
#include <uv.h>
|
||||||
|
#include "pppoe_info.h"
|
||||||
|
|
||||||
#include <uthash/uthash.h>
|
void user_info_init();
|
||||||
|
int user_info_add(unsigned int userid, PUSER_INFO pInfo);
|
||||||
typedef struct {
|
void user_info_remove(unsigned int userid);
|
||||||
unsigned short qinq_tag1;
|
void user_info_delete(unsigned int userid);
|
||||||
unsigned short qinq_tag2;
|
PUSER_INFO user_info_get_by_userid(unsigned int userid);
|
||||||
unsigned char mac_addr[6];
|
void user_info_change_status(PUSER_INFO pInfo, USER_STATUS status);
|
||||||
const char *pppoe_user;
|
PUSER_INFO_CONTEXT get_all_user();
|
||||||
const char *pppoe_passwd;
|
uv_rwlock_t* get_user_lock();
|
||||||
} USER_INFO, *PUSER_INFO;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned int userid;
|
|
||||||
USER_INFO user_info;
|
|
||||||
|
|
||||||
UT_hash_handle hh;
|
|
||||||
} USER_INFO_LIST, *PUSER_INFO_LIST;
|
|
||||||
|
|
||||||
void user_info_init();
|
|
||||||
int user_info_add(unsigned int userid, PUSER_INFO pInfo);
|
|
||||||
void user_info_remove(unsigned int userid);
|
|
||||||
PUSER_INFO user_info_get_by_userid(unsigned int userid);
|
|
||||||
PUSER_INFO_LIST user_info_getall();
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -46,4 +46,12 @@ application:
|
||||||
{
|
{
|
||||||
svr_port = 6278; # ZeroMQ 服务器端口
|
svr_port = 6278; # ZeroMQ 服务器端口
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# 网络相关
|
||||||
|
network:
|
||||||
|
{
|
||||||
|
nic_card = "ens160" # 收发数据使用的网卡名称
|
||||||
|
nic_mac = "00:0C:01:02:00:01" # 收发数据使用的网卡Mac地址
|
||||||
|
vxlan_support = true; # 是否支持vxLan封装
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -79,7 +79,8 @@ static const char *load_string_value(const char *pKeyName) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (symmetric_decrypto(AES128_ECB_PKCS7PADDING_SHA1PRNG, pBuf, bufSize, &buf, &outSize, pKey) != ERR_SUCCESS) {
|
if (symmetric_decrypto(AES128_ECB_PKCS7PADDING_SHA1PRNG, pBuf, bufSize, &buf, &outSize, pKey)
|
||||||
|
!= ERR_SUCCESS) {
|
||||||
free((void *)pKey);
|
free((void *)pKey);
|
||||||
free(pBuf);
|
free(pBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -479,6 +480,9 @@ do {
|
||||||
/* 消息队列相配置 */ \
|
/* 消息队列相配置 */ \
|
||||||
/* ZeroMq配置 */ \
|
/* ZeroMq配置 */ \
|
||||||
ADD_CFG_ITEM(CFG_MQ_SVR_PORT, "application.zero_mq.svr_port", VALUE_TYPE_INTEGRAL, "6378", "ZeroMQ server port"); \
|
ADD_CFG_ITEM(CFG_MQ_SVR_PORT, "application.zero_mq.svr_port", VALUE_TYPE_INTEGRAL, "6378", "ZeroMQ server port"); \
|
||||||
|
/* 网络相关配置 */ \
|
||||||
|
ADD_CFG_ITEM(CFG_NIC_CARD_NAME, "application.network.svr_port", VALUE_TYPE_STRING, "ens160", "Network card name to send data"); \
|
||||||
|
ADD_CFG_ITEM(CFG_VXLAN_SUPPORT, "application.network.vxlan_support", VALUE_TYPE_BOOL, "1", "Is support vxLan tune"); \
|
||||||
} while (0)// clang-format on
|
} while (0)// clang-format on
|
||||||
|
|
||||||
int init_config_system(const char *pCfgFile, const char *pKey) {
|
int init_config_system(const char *pCfgFile, const char *pKey) {
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
//
|
//
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
const char* config_get_nic_name() {
|
||||||
|
return cfg_get_string_value(CFG_NIC_CARD_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cfg_get_support_vxlan() {
|
||||||
|
return cfg_get_bool_value(CFG_VXLAN_SUPPORT);
|
||||||
|
}
|
||||||
|
|
||||||
const char *config_get_ssl_ca_path() {
|
const char *config_get_ssl_ca_path() {
|
||||||
return cfg_get_string_value(CFG_CURL_CA_PATH);
|
return cfg_get_string_value(CFG_CURL_CA_PATH);
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,8 @@ typedef enum {
|
||||||
CFG_DB_MYSQL_PASSWD = 19,
|
CFG_DB_MYSQL_PASSWD = 19,
|
||||||
CFG_DB_MYSQL_DB_NAME = 20,
|
CFG_DB_MYSQL_DB_NAME = 20,
|
||||||
CFG_MQ_SVR_PORT = 21,
|
CFG_MQ_SVR_PORT = 21,
|
||||||
|
CFG_NIC_CARD_NAME = 22,
|
||||||
|
CFG_VXLAN_SUPPORT = 23,
|
||||||
|
|
||||||
CONFIG_ITEM_ID_MAX
|
CONFIG_ITEM_ID_MAX
|
||||||
} CONFIG_ITEM_ID;
|
} CONFIG_ITEM_ID;
|
||||||
|
@ -79,7 +81,8 @@ void config_item_dump(const char *titleMessage);
|
||||||
const char *config_item_dump_fmt(const char *titleMessage);
|
const char *config_item_dump_fmt(const char *titleMessage);
|
||||||
const char *get_config_key(const char *pKeygen);
|
const char *get_config_key(const char *pKeygen);
|
||||||
const char *get_config_keygen();
|
const char *get_config_keygen();
|
||||||
|
int cfg_get_support_vxlan();
|
||||||
|
const char *config_get_nic_name();
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -462,52 +462,50 @@ void sys_unlock_tcpip_core(void);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MEMP_OVERFLOW_CHECK 1
|
|
||||||
|
|
||||||
#define PPP_USE_PBUF_RAM 1
|
#define PPP_USE_PBUF_RAM 1
|
||||||
|
|
||||||
#define LWIP_DEBUG 1
|
//#define LWIP_DEBUG 1
|
||||||
|
|
||||||
#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF
|
//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_OFF
|
||||||
//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING
|
//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_WARNING
|
||||||
//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SERIOUS
|
//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SERIOUS
|
||||||
//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE
|
//#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_SEVERE
|
||||||
|
|
||||||
//#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
|
//#define LWIP_DBG_TYPES_ON LWIP_DBG_ON
|
||||||
#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH)
|
//#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH)
|
||||||
|
|
||||||
//#define ETHARP_DEBUG LWIP_DBG_ON
|
#define ETHARP_DEBUG LWIP_DBG_OFF
|
||||||
//#define NETIF_DEBUG LWIP_DBG_ON
|
#define NETIF_DEBUG LWIP_DBG_OFF
|
||||||
//#define PBUF_DEBUG LWIP_DBG_ON
|
#define PBUF_DEBUG LWIP_DBG_OFF
|
||||||
//#define API_LIB_DEBUG LWIP_DBG_ON
|
#define API_LIB_DEBUG LWIP_DBG_OFF
|
||||||
//#define API_MSG_DEBUG LWIP_DBG_ON
|
#define API_MSG_DEBUG LWIP_DBG_OFF
|
||||||
//#define SOCKETS_DEBUG LWIP_DBG_ON
|
#define SOCKETS_DEBUG LWIP_DBG_OFF
|
||||||
//#define ICMP_DEBUG LWIP_DBG_ON
|
#define ICMP_DEBUG LWIP_DBG_OFF
|
||||||
//#define IGMP_DEBUG LWIP_DBG_ON
|
#define IGMP_DEBUG LWIP_DBG_OFF
|
||||||
//#define INET_DEBUG LWIP_DBG_ON
|
#define INET_DEBUG LWIP_DBG_OFF
|
||||||
//#define IP_DEBUG LWIP_DBG_ON
|
#define IP_DEBUG LWIP_DBG_OFF
|
||||||
//#define IP_REASS_DEBUG LWIP_DBG_ON
|
#define IP_REASS_DEBUG LWIP_DBG_OFF
|
||||||
//#define RAW_DEBUG LWIP_DBG_ON
|
#define RAW_DEBUG LWIP_DBG_OFF
|
||||||
//#define MEM_DEBUG LWIP_DBG_ON
|
#define MEM_DEBUG LWIP_DBG_OFF
|
||||||
//#define MEMP_DEBUG LWIP_DBG_ON
|
#define MEMP_DEBUG LWIP_DBG_OFF
|
||||||
//#define SYS_DEBUG LWIP_DBG_ON
|
#define SYS_DEBUG LWIP_DBG_OFF
|
||||||
//#define TCP_DEBUG LWIP_DBG_ON
|
#define TCP_DEBUG LWIP_DBG_OFF
|
||||||
//#define TCP_INPUT_DEBUG LWIP_DBG_ON
|
#define TCP_INPUT_DEBUG LWIP_DBG_OFF
|
||||||
//#define TCP_FR_DEBUG LWIP_DBG_ON
|
#define TCP_FR_DEBUG LWIP_DBG_OFF
|
||||||
//#define TCP_RTO_DEBUG LWIP_DBG_ON
|
#define TCP_RTO_DEBUG LWIP_DBG_OFF
|
||||||
//#define TCP_CWND_DEBUG LWIP_DBG_ON
|
#define TCP_CWND_DEBUG LWIP_DBG_OFF
|
||||||
//#define TCP_WND_DEBUG LWIP_DBG_ON
|
#define TCP_WND_DEBUG LWIP_DBG_OFF
|
||||||
//#define TCP_OUTPUT_DEBUG LWIP_DBG_ON
|
#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
|
||||||
//#define TCP_RST_DEBUG LWIP_DBG_ON
|
#define TCP_RST_DEBUG LWIP_DBG_OFF
|
||||||
//#define TCP_QLEN_DEBUG LWIP_DBG_ON
|
#define TCP_QLEN_DEBUG LWIP_DBG_OFF
|
||||||
//#define UDP_DEBUG LWIP_DBG_ON
|
#define UDP_DEBUG LWIP_DBG_OFF
|
||||||
//#define TCPIP_DEBUG LWIP_DBG_ON
|
#define TCPIP_DEBUG LWIP_DBG_OFF
|
||||||
//#define PPP_DEBUG LWIP_DBG_ON
|
#define PPP_DEBUG LWIP_DBG_OFF
|
||||||
//#define SLIP_DEBUG LWIP_DBG_ON
|
#define SLIP_DEBUG LWIP_DBG_OFF
|
||||||
//#define DHCP_DEBUG LWIP_DBG_ON
|
#define DHCP_DEBUG LWIP_DBG_OFF
|
||||||
//#define AUTOIP_DEBUG LWIP_DBG_ON
|
#define AUTOIP_DEBUG LWIP_DBG_OFF
|
||||||
//#define SNMP_MSG_DEBUG LWIP_DBG_ON
|
#define SNMP_MSG_DEBUG LWIP_DBG_OFF
|
||||||
//#define SNMP_MIB_DEBUG LWIP_DBG_ON
|
#define SNMP_MIB_DEBUG LWIP_DBG_OFF
|
||||||
//#define DNS_DEBUG LWIP_DBG_ON
|
#define DNS_DEBUG LWIP_DBG_OFF
|
||||||
|
|
||||||
#endif /* LWIP_LWIPOPTS_H */
|
#endif /* LWIP_LWIPOPTS_H */
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
err_t pppoeif_init(struct netif *netif);
|
err_t pppoeif_init(struct netif *netif);
|
||||||
struct netif *create_pppoe_if(PPPPOE_SESSION pSession);
|
struct netif *create_pppoe_if(PUSER_INFO_CONTEXT pUser);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -95,17 +95,17 @@ int pppoeif_select(struct netif *netif) {
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
static void low_level_init(struct netif *netif) {
|
static void low_level_init(struct netif *netif) {
|
||||||
PPPPOE_SESSION pSession = (PPPPOE_SESSION)netif->state;
|
PUSER_INFO_CONTEXT pUser = (PUSER_INFO_CONTEXT)netif->state;
|
||||||
|
|
||||||
LWIP_DEBUGF(PPPOEIF_DEBUG, ("<%p>pppoeif_init\n", (void *)pSession));
|
LWIP_DEBUGF(PPPOEIF_DEBUG, ("<%p>pppoeif_init\n", (void *)pUser));
|
||||||
|
|
||||||
/* Obtain MAC address from network interface. */
|
/* Obtain MAC address from network interface. */
|
||||||
netif->hwaddr[0] = pSession->user_info.mac_addr[0];
|
netif->hwaddr[0] = pUser->user_info.mac_addr[0];
|
||||||
netif->hwaddr[1] = pSession->user_info.mac_addr[1];
|
netif->hwaddr[1] = pUser->user_info.mac_addr[1];
|
||||||
netif->hwaddr[2] = pSession->user_info.mac_addr[2];
|
netif->hwaddr[2] = pUser->user_info.mac_addr[2];
|
||||||
netif->hwaddr[3] = pSession->user_info.mac_addr[3];
|
netif->hwaddr[3] = pUser->user_info.mac_addr[3];
|
||||||
netif->hwaddr[4] = pSession->user_info.mac_addr[4];
|
netif->hwaddr[4] = pUser->user_info.mac_addr[4];
|
||||||
netif->hwaddr[5] = pSession->user_info.mac_addr[5];
|
netif->hwaddr[5] = pUser->user_info.mac_addr[5];
|
||||||
netif->hwaddr_len = 6;
|
netif->hwaddr_len = 6;
|
||||||
|
|
||||||
/* device capabilities */
|
/* device capabilities */
|
||||||
|
@ -182,7 +182,7 @@ static void link_callback(struct netif *state_netif) {
|
||||||
}
|
}
|
||||||
#endif /* LWIP_NETIF_LINK_CALLBACK */
|
#endif /* LWIP_NETIF_LINK_CALLBACK */
|
||||||
|
|
||||||
struct netif *create_pppoe_if(PPPPOE_SESSION pSession) {
|
struct netif *create_pppoe_if(PUSER_INFO_CONTEXT pUser) {
|
||||||
struct netif *netif;
|
struct netif *netif;
|
||||||
ip4_addr_t ipaddr, netmask, gw;
|
ip4_addr_t ipaddr, netmask, gw;
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ struct netif *create_pppoe_if(PPPPOE_SESSION pSession) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
netif_add(netif, &ipaddr, &netmask, &gw, pSession, pppoeif_init, tcpip_input);
|
netif_add(netif, &ipaddr, &netmask, &gw, pUser, pppoeif_init, tcpip_input);
|
||||||
|
|
||||||
#if LWIP_NETIF_STATUS_CALLBACK
|
#if LWIP_NETIF_STATUS_CALLBACK
|
||||||
netif_set_status_callback(netif, status_callback);
|
netif_set_status_callback(netif, status_callback);
|
||||||
|
|
|
@ -54,7 +54,7 @@
|
||||||
#include "netif/etharp.h"
|
#include "netif/etharp.h"
|
||||||
|
|
||||||
#include "netif/rawif.h"
|
#include "netif/rawif.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#if defined(LWIP_UNIX_LINUX)
|
#if defined(LWIP_UNIX_LINUX)
|
||||||
#include <linux/if.h>
|
#include <linux/if.h>
|
||||||
|
@ -80,17 +80,23 @@ struct sockaddr_ll {
|
||||||
unsigned char sll_addr[8];
|
unsigned char sll_addr[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
unsigned char *output_head;
|
||||||
|
unsigned char *input_head;
|
||||||
|
} VXLAN_BUF, *PVXLAN_BUF;
|
||||||
|
|
||||||
struct rawif {
|
struct rawif {
|
||||||
/* Add whatever per-interface state that is needed here. */
|
/* Add whatever per-interface state that is needed here. */
|
||||||
int fd;
|
int fd;
|
||||||
int if_index;
|
int if_index;
|
||||||
const char *eth_name;
|
const char *eth_name;
|
||||||
|
int vxlan_support;
|
||||||
unsigned char mac_addr[6];
|
unsigned char mac_addr[6];
|
||||||
|
|
||||||
|
VXLAN_BUF vxlan_buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned char g_macAddr[6];
|
static unsigned int g_localIpAddrBegin = DEFAULT_GW_IPADDR + 1;
|
||||||
static char *g_ethName;
|
|
||||||
static unsigned int g_localIpAddrBegin = DEFAULT_GW_IPADDR + 1;
|
|
||||||
|
|
||||||
/* Forward declarations. */
|
/* Forward declarations. */
|
||||||
static void rawif_input(struct netif *netif);
|
static void rawif_input(struct netif *netif);
|
||||||
|
@ -106,6 +112,8 @@ static void low_level_init(struct netif *netif) {
|
||||||
|
|
||||||
rawif = (struct rawif *)netif->state;
|
rawif = (struct rawif *)netif->state;
|
||||||
|
|
||||||
|
dzlog_debug("++++++++++++rawif<%p>\n", (void *)rawif);
|
||||||
|
|
||||||
rawif->fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
|
rawif->fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
|
||||||
|
|
||||||
LWIP_DEBUGF(RAWIF_DEBUG, ("rawif_init: fd %d\n", rawif->fd));
|
LWIP_DEBUGF(RAWIF_DEBUG, ("rawif_init: fd %d\n", rawif->fd));
|
||||||
|
@ -165,13 +173,7 @@ static void low_level_init(struct netif *netif) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Obtain MAC address from network interface. */
|
/* Obtain MAC address from network interface. */
|
||||||
|
memcpy(netif->hwaddr, rawif->mac_addr, 6);
|
||||||
netif->hwaddr[0] = 0x00;
|
|
||||||
netif->hwaddr[1] = 0x0C;
|
|
||||||
netif->hwaddr[2] = 0x01;
|
|
||||||
netif->hwaddr[3] = 0x02;
|
|
||||||
netif->hwaddr[4] = 0x00;
|
|
||||||
netif->hwaddr[5] = 0x01;
|
|
||||||
netif->hwaddr_len = 6;
|
netif->hwaddr_len = 6;
|
||||||
|
|
||||||
/* device capabilities */
|
/* device capabilities */
|
||||||
|
@ -260,34 +262,30 @@ static struct pbuf *low_level_input(struct netif *netif) {
|
||||||
}
|
}
|
||||||
len = (u16_t)readlen;
|
len = (u16_t)readlen;
|
||||||
|
|
||||||
//{0x00, 0x0C, 0x01, 0x02, 0x00, 0x01}
|
if ((buf[0] == 0x00 && buf[1] == 0x0C && buf[2] == 0x01 && buf[3] == 0x02)
|
||||||
|
|| memcmp(buf, bmac, 6) == 0) {
|
||||||
|
MIB2_STATS_NETIF_ADD(netif, ifinoctets, len);
|
||||||
|
|
||||||
if((buf[0] != 0x00 && buf[1] != 0x0C && buf[2] != 0x01 && buf[3] != 0x02) &&
|
/* We allocate a pbuf chain of pbufs from the pool. */
|
||||||
memcmp(buf, bmac, 6) != 0) {
|
p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
|
||||||
|
if (p != NULL) {
|
||||||
|
pbuf_take(p, buf, len);
|
||||||
|
/* acknowledge that packet has been read(); */
|
||||||
|
} else {
|
||||||
|
/* drop packet(); */
|
||||||
|
MIB2_STATS_NETIF_INC(netif, ifindiscards);
|
||||||
|
LWIP_DEBUGF(NETIF_DEBUG, ("rawif_input: could not allocate pbuf\n"));
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
MIB2_STATS_NETIF_ADD(netif, ifinoctets, len);
|
|
||||||
|
|
||||||
/* We allocate a pbuf chain of pbufs from the pool. */
|
|
||||||
p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
|
|
||||||
if (p != NULL) {
|
|
||||||
pbuf_take(p, buf, len);
|
|
||||||
/* acknowledge that packet has been read(); */
|
|
||||||
} else {
|
|
||||||
/* drop packet(); */
|
|
||||||
MIB2_STATS_NETIF_INC(netif, ifindiscards);
|
|
||||||
LWIP_DEBUGF(NETIF_DEBUG, ("rawif_input: could not allocate pbuf\n"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err_t rawif_output(struct netif *netif, struct pbuf *p) {
|
err_t rawif_output(struct netif *netif, struct pbuf *p) {
|
||||||
return low_level_output(netif, p);
|
return low_level_output(netif, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
/*
|
/*
|
||||||
* rawif_input():
|
* rawif_input():
|
||||||
|
@ -326,14 +324,15 @@ static void rawif_input(struct netif *netif) {
|
||||||
*/
|
*/
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
err_t rawif_init(struct netif *netif) {
|
err_t rawif_init(struct netif *netif) {
|
||||||
struct ifreq ifr;
|
struct rawif *rawif = (struct rawif *)netif->state;
|
||||||
struct rawif *rawif = (struct rawif *)mem_malloc(sizeof(struct rawif));
|
|
||||||
|
dzlog_debug("++++++++++++rawif<%p>\n", (void *)rawif);
|
||||||
|
|
||||||
if (rawif == NULL) {
|
if (rawif == NULL) {
|
||||||
LWIP_DEBUGF(NETIF_DEBUG, ("rawif_init: out of memory for rawif\n"));
|
LWIP_DEBUGF(NETIF_DEBUG, ("rawif_init: out of memory for rawif\n"));
|
||||||
return ERR_MEM;
|
return ERR_MEM;
|
||||||
}
|
}
|
||||||
netif->state = rawif;
|
|
||||||
MIB2_INIT_NETIF(netif, snmp_ifType_other, 100000000);
|
MIB2_INIT_NETIF(netif, snmp_ifType_other, 100000000);
|
||||||
|
|
||||||
netif->name[0] = 'r';
|
netif->name[0] = 'r';
|
||||||
|
@ -347,12 +346,6 @@ err_t rawif_init(struct netif *netif) {
|
||||||
netif->linkoutput = low_level_output;
|
netif->linkoutput = low_level_output;
|
||||||
netif->mtu = 1500;
|
netif->mtu = 1500;
|
||||||
|
|
||||||
rawif->eth_name = g_ethName;
|
|
||||||
memcpy(rawif->mac_addr, g_macAddr, 6);
|
|
||||||
|
|
||||||
memset(&ifr, 0, sizeof(ifr));
|
|
||||||
strcpy(ifr.ifr_name, rawif->eth_name);
|
|
||||||
|
|
||||||
low_level_init(netif);
|
low_level_init(netif);
|
||||||
|
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
|
@ -363,37 +356,11 @@ void rawif_poll(struct netif *netif) {
|
||||||
rawif_input(netif);
|
rawif_input(netif);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if NO_SYS
|
|
||||||
|
|
||||||
int rawif_select(struct netif *netif) {
|
|
||||||
fd_set fdset;
|
|
||||||
int ret;
|
|
||||||
struct timeval tv;
|
|
||||||
struct rawif *rawif;
|
|
||||||
u32_t msecs = sys_timeouts_sleeptime();
|
|
||||||
|
|
||||||
rawif = (struct rawif *)netif->state;
|
|
||||||
|
|
||||||
tv.tv_sec = msecs / 1000;
|
|
||||||
tv.tv_usec = (msecs % 1000) * 1000;
|
|
||||||
|
|
||||||
FD_ZERO(&fdset);
|
|
||||||
FD_SET(rawif->fd, &fdset);
|
|
||||||
|
|
||||||
ret = select(rawif->fd + 1, &fdset, NULL, NULL, &tv);
|
|
||||||
if (ret > 0) {
|
|
||||||
rawif_input(netif);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* NO_SYS */
|
|
||||||
|
|
||||||
_Noreturn static void rawif_thread(void *arg) {
|
_Noreturn static void rawif_thread(void *arg) {
|
||||||
struct netif *netif;
|
struct netif *netif;
|
||||||
struct rawif *rawif;
|
struct rawif *rawif;
|
||||||
fd_set fdset;
|
fd_set fdset;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
netif = (struct netif *)arg;
|
netif = (struct netif *)arg;
|
||||||
rawif = (struct rawif *)netif->state;
|
rawif = (struct rawif *)netif->state;
|
||||||
|
@ -413,7 +380,6 @@ _Noreturn static void rawif_thread(void *arg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* NO_SYS */
|
|
||||||
|
|
||||||
#if LWIP_NETIF_STATUS_CALLBACK
|
#if LWIP_NETIF_STATUS_CALLBACK
|
||||||
static void status_callback(struct netif *state_netif) {
|
static void status_callback(struct netif *state_netif) {
|
||||||
|
@ -444,13 +410,18 @@ static err_t netif_input_data(struct pbuf *p, struct netif *inp) {
|
||||||
|
|
||||||
LWIP_ASSERT_CORE_LOCKED();
|
LWIP_ASSERT_CORE_LOCKED();
|
||||||
NETIF_FOREACH(netif) {
|
NETIF_FOREACH(netif) {
|
||||||
err_t err;
|
err_t err;
|
||||||
unsigned char* pMac = (unsigned char*)p->payload;
|
unsigned char *pMac = (unsigned char *)p->payload;
|
||||||
|
|
||||||
if(memcmp(pMac, netif->hwaddr, netif->hwaddr_len) == 0) {
|
if (netif->hwaddr_len == 6 && memcmp(pMac, netif->hwaddr, netif->hwaddr_len) == 0) {
|
||||||
// printf("++++++receive %02X:%02X:%02X:%02X:%02X:%02X\n",
|
#if 0
|
||||||
// pMac[0], pMac[1], pMac[2], pMac[3], pMac[4], pMac[5]);
|
printf("++++++receive %02X:%02X:%02X:%02X:%02X:%02X\n",
|
||||||
|
pMac[0], pMac[1], pMac[2], pMac[3], pMac[4], pMac[5]);
|
||||||
|
|
||||||
|
printf("---- Call netif(%c%c:%d) <%p>, input = <%p>, %02X:%02X\n",
|
||||||
|
netif->name[0], netif->name[1], netif->num,
|
||||||
|
(void*)netif, (void*)netif->input, netif->hwaddr[4], netif->hwaddr[5]);
|
||||||
|
#endif
|
||||||
if ((err = netif->input(p, netif)) != ERR_OK) {
|
if ((err = netif->input(p, netif)) != ERR_OK) {
|
||||||
LWIP_DEBUGF(NETIF_DEBUG, ("pppoeif_input: netif input error\n"));
|
LWIP_DEBUGF(NETIF_DEBUG, ("pppoeif_input: netif input error\n"));
|
||||||
pbuf_free(p);
|
pbuf_free(p);
|
||||||
|
@ -465,10 +436,19 @@ static err_t netif_input_data(struct pbuf *p, struct netif *inp) {
|
||||||
|
|
||||||
struct netif *bind_rawsocket_if(const char *eth_name) {
|
struct netif *bind_rawsocket_if(const char *eth_name) {
|
||||||
struct netif *netif;
|
struct netif *netif;
|
||||||
|
struct ifreq ifr;
|
||||||
ip4_addr_t ipaddr, netmask, gw;
|
ip4_addr_t ipaddr, netmask, gw;
|
||||||
|
struct rawif *rawif = (struct rawif *)mem_malloc(sizeof(struct rawif));
|
||||||
|
|
||||||
if (eth_name) {
|
if (rawif == NULL) {
|
||||||
g_ethName = strdup(eth_name);
|
dzlog_error("bind_rawsocket_if: out of memory for rawif\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(rawif, 0, sizeof(struct rawif));
|
||||||
|
|
||||||
|
if (eth_name && strlen(eth_name) > 0) {
|
||||||
|
rawif->eth_name = eth_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
ip4_addr_set_zero(&gw);
|
ip4_addr_set_zero(&gw);
|
||||||
|
@ -489,14 +469,26 @@ struct netif *bind_rawsocket_if(const char *eth_name) {
|
||||||
(g_localIpAddrBegin & 0xFF));
|
(g_localIpAddrBegin & 0xFF));
|
||||||
g_localIpAddrBegin++;
|
g_localIpAddrBegin++;
|
||||||
|
|
||||||
|
rawif->vxlan_support = cfg_get_support_vxlan();
|
||||||
|
rawif->mac_addr[0] = 0x00;
|
||||||
|
rawif->mac_addr[1] = 0x0C;
|
||||||
|
rawif->mac_addr[2] = 0x01;
|
||||||
|
rawif->mac_addr[3] = 0x02;
|
||||||
|
rawif->mac_addr[4] = 0x00;
|
||||||
|
rawif->mac_addr[5] = 0x01;
|
||||||
|
memset(&ifr, 0, sizeof(ifr));
|
||||||
|
strcpy(ifr.ifr_name, rawif->eth_name);
|
||||||
|
|
||||||
netif = (struct netif *)mem_malloc(sizeof(struct netif));
|
netif = (struct netif *)mem_malloc(sizeof(struct netif));
|
||||||
|
|
||||||
if (!netif) {
|
if (!netif) {
|
||||||
|
mem_free(rawif);
|
||||||
dzlog_error("Create netif error\n");
|
dzlog_error("Create netif error\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
netif_add(netif, &ipaddr, &netmask, &gw, NULL, rawif_init, netif_input_data);
|
dzlog_debug("++++++++++++rawif<%p>\n", (void *)rawif);
|
||||||
|
netif_add(netif, &ipaddr, &netmask, &gw, rawif, rawif_init, netif_input_data);
|
||||||
|
|
||||||
#if LWIP_NETIF_STATUS_CALLBACK
|
#if LWIP_NETIF_STATUS_CALLBACK
|
||||||
netif_set_status_callback(netif, status_callback);
|
netif_set_status_callback(netif, status_callback);
|
||||||
|
|
|
@ -750,11 +750,7 @@ pbuf_free(struct pbuf *p)
|
||||||
* further protection. */
|
* further protection. */
|
||||||
SYS_ARCH_PROTECT(old_level);
|
SYS_ARCH_PROTECT(old_level);
|
||||||
/* all pbufs in a chain are referenced at least once */
|
/* all pbufs in a chain are referenced at least once */
|
||||||
//LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
|
LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
|
||||||
if(p->ref == 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* decrease reference count (number of pointers to pbuf) */
|
/* decrease reference count (number of pointers to pbuf) */
|
||||||
ref = --(p->ref);
|
ref = --(p->ref);
|
||||||
SYS_ARCH_UNPROTECT(old_level);
|
SYS_ARCH_UNPROTECT(old_level);
|
||||||
|
|
|
@ -2,24 +2,49 @@
|
||||||
// Created by xajhuang on 2022/5/10.
|
// Created by xajhuang on 2022/5/10.
|
||||||
//
|
//
|
||||||
#include <zlog.h>
|
#include <zlog.h>
|
||||||
|
#include <uv/unix.h>
|
||||||
|
#include <uv.h>
|
||||||
#include "pppoe_session.h"
|
#include "pppoe_session.h"
|
||||||
#include "netif/rawif.h"
|
#include "netif/rawif.h"
|
||||||
#include "netif/ppp/ppp.h"
|
#include "netif/ppp/ppp.h"
|
||||||
#include "netif/ppp/pppoe.h"
|
#include "netif/ppp/pppoe.h"
|
||||||
#include "netif/pppoeif.h"
|
#include "netif/pppoeif.h"
|
||||||
|
#include "misc.h"
|
||||||
|
#include "user_errno.h"
|
||||||
|
#include "netif/ppp/pppapi.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
static PPPPOE_SESSION g_pSessionList = NULL;
|
struct PPPOE_ERR_INFO_ {
|
||||||
|
int errid;
|
||||||
|
const char *errmsg;
|
||||||
|
} g_pppoeErr[] = {
|
||||||
|
{PPPERR_NONE, "No error"},
|
||||||
|
{PPPERR_PARAM, "Invalid parameter"},
|
||||||
|
{PPPERR_OPEN, "Unable to open PPP session"},
|
||||||
|
{PPPERR_DEVICE, "Invalid I/O device for PPP"},
|
||||||
|
{PPPERR_ALLOC, "Unable to allocate resources"},
|
||||||
|
{PPPERR_USER, "User interrupt"},
|
||||||
|
{PPPERR_CONNECT, "Connection lost"},
|
||||||
|
{PPPERR_AUTHFAIL, "Failed authentication challenge"},
|
||||||
|
{PPPERR_PROTOCOL, "Failed to meet protocol"},
|
||||||
|
{PPPERR_PEERDEAD, "Connection timeout"},
|
||||||
|
{PPPERR_IDLETIMEOUT, "Idle Timeout"},
|
||||||
|
{PPPERR_CONNECTTIME, "Max connect time reach max time"},
|
||||||
|
{PPPERR_LOOPBACK, "Loopback detect"},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct netif *g_rawSocketIf = NULL;
|
||||||
|
|
||||||
static void pppLinkStatusCallback(ppp_pcb *pcb, int errCode, void *ctx) {
|
static void pppLinkStatusCallback(ppp_pcb *pcb, int errCode, void *ctx) {
|
||||||
struct netif *pppif = ppp_netif(pcb);
|
struct netif *pppif = ppp_netif(pcb);
|
||||||
struct pppoe_softc *sc = (struct pppoe_softc *)pcb->link_ctx_cb;
|
struct pppoe_softc *sc = (struct pppoe_softc *)pcb->link_ctx_cb;
|
||||||
|
PUSER_INFO_CONTEXT pUser = (PUSER_INFO_CONTEXT)ctx;
|
||||||
LWIP_UNUSED_ARG(ctx);
|
|
||||||
|
|
||||||
switch (errCode) {
|
switch (errCode) {
|
||||||
case PPPERR_NONE: { /* No error. */
|
case PPPERR_NONE: { /* No error. */
|
||||||
dzlog_info("<%p> pppLinkStatusCallback: PPPERR_NONE(%08X), Session: %04X\n",
|
dzlog_info("<%p> PPPoE user(%05d:%s) connect server succeeded[%08X], Session: %04X\n",
|
||||||
pcb,
|
pcb,
|
||||||
|
pUser->userid, pUser->user_info.pppoe_user,
|
||||||
pcb->lcp_gotoptions.magicnumber,
|
pcb->lcp_gotoptions.magicnumber,
|
||||||
sc->sc_session);
|
sc->sc_session);
|
||||||
#if LWIP_IPV4
|
#if LWIP_IPV4
|
||||||
|
@ -34,56 +59,39 @@ static void pppLinkStatusCallback(ppp_pcb *pcb, int errCode, void *ctx) {
|
||||||
#if PPP_IPV6_SUPPORT
|
#if PPP_IPV6_SUPPORT
|
||||||
dzlog_info(" our6_ipaddr = %s\n", ip6addr_ntoa(netif_ip6_addr(pppif, 0)));
|
dzlog_info(" our6_ipaddr = %s\n", ip6addr_ntoa(netif_ip6_addr(pppif, 0)));
|
||||||
#endif /* PPP_IPV6_SUPPORT */
|
#endif /* PPP_IPV6_SUPPORT */
|
||||||
|
pUser->session.status = STATUS_TASK_CONNECTED;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PPPERR_PARAM: { /* Invalid parameter. */
|
case PPPERR_PARAM:
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_PARAM\n", pcb);
|
case PPPERR_AUTHFAIL:
|
||||||
|
case PPPERR_PROTOCOL:
|
||||||
|
dzlog_error("<%p> pppLinkStatusCallback: %s(%d)",
|
||||||
|
pcb,
|
||||||
|
g_pppoeErr[errCode].errmsg,
|
||||||
|
g_pppoeErr[errCode].errid);
|
||||||
|
if (pUser->session.status != STATUS_TASK_DELETE) {
|
||||||
|
pUser->session.status = STATUS_TASK_ERROR;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
case PPPERR_USER:
|
||||||
case PPPERR_OPEN: { /* Unable to open PPP session. */
|
dzlog_info("User(%05d:%s) disconnect\n", pUser->userid, pUser->user_info.pppoe_user);
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_OPEN\n", pcb);
|
|
||||||
break;
|
break;
|
||||||
}
|
case PPPERR_OPEN:
|
||||||
case PPPERR_DEVICE: { /* Invalid I/O device for PPP. */
|
case PPPERR_DEVICE:
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_DEVICE\n", pcb);
|
case PPPERR_ALLOC:
|
||||||
|
case PPPERR_CONNECT:
|
||||||
|
case PPPERR_PEERDEAD:
|
||||||
|
case PPPERR_IDLETIMEOUT:
|
||||||
|
case PPPERR_CONNECTTIME:
|
||||||
|
case PPPERR_LOOPBACK:
|
||||||
|
dzlog_error("<%p> pppLinkStatusCallback: %s(%d)\n",
|
||||||
|
pcb,
|
||||||
|
g_pppoeErr[errCode].errmsg,
|
||||||
|
g_pppoeErr[errCode].errid);
|
||||||
|
if (pUser->session.status != STATUS_TASK_DELETE) {
|
||||||
|
pUser->session.status = STATUS_TASK_DISCONNECTED;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case PPPERR_ALLOC: { /* Unable to allocate resources. */
|
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_ALLOC\n", pcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PPPERR_USER: { /* User interrupt. */
|
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_USER\n", pcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PPPERR_CONNECT: { /* Connection lost. */
|
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_CONNECT\n", pcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PPPERR_AUTHFAIL: { /* Failed authentication challenge. */
|
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_AUTHFAIL\n", pcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PPPERR_PROTOCOL: { /* Failed to meet protocol. */
|
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_PROTOCOL\n", pcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PPPERR_PEERDEAD: { /* Connection timeout */
|
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_PEERDEAD\n", pcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PPPERR_IDLETIMEOUT: { /* Idle Timeout */
|
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_IDLETIMEOUT\n", pcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PPPERR_CONNECTTIME: { /* Max connect time reached */
|
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_CONNECTTIME\n", pcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case PPPERR_LOOPBACK: { /* Loopback detected */
|
|
||||||
printf("<%p> pppLinkStatusCallback: PPPERR_LOOPBACK\n", pcb);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
default: {
|
||||||
printf("<%p> pppLinkStatusCallback: unknown errCode %d\n", pcb, errCode);
|
printf("<%p> pppLinkStatusCallback: unknown errCode %d\n", pcb, errCode);
|
||||||
break;
|
break;
|
||||||
|
@ -91,78 +99,147 @@ static void pppLinkStatusCallback(ppp_pcb *pcb, int errCode, void *ctx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct netif* g_rawSocketIf = NULL;
|
_Noreturn void sessionCalcCb(void *UNUSED(pArg)) {
|
||||||
|
PUSER_INFO_CONTEXT pUserList = get_all_user();
|
||||||
|
|
||||||
struct netif* get_rawsocket_if(void) {
|
do {
|
||||||
return g_rawSocketIf;
|
PUSER_INFO_CONTEXT pUser, pTmp;
|
||||||
|
|
||||||
|
uv_rwlock_rdlock(get_user_lock());
|
||||||
|
HASH_ITER(hh, pUserList, pUser, pTmp) {
|
||||||
|
PPPPOE_SESSION pSession = &pUser->session;
|
||||||
|
|
||||||
|
switch (pSession->status) {
|
||||||
|
case STATUS_TASK_INIT:
|
||||||
|
if (pppoe_session_create(pUser) == ERR_SUCCESS) {
|
||||||
|
dzlog_debug("User(%05d:%s) init pppoe session\n", pUser->userid, pUser->user_info.pppoe_user);
|
||||||
|
pSession->status = STATUS_TASK_DIAL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATUS_TASK_DIAL:
|
||||||
|
if (pUser->session.retry.timeout == 0) {
|
||||||
|
dzlog_debug("User(%05d:%s) connect PPPoE server\n", pUser->userid, pUser->user_info.pppoe_user);
|
||||||
|
pppapi_connect(pSession->ppp, 0);
|
||||||
|
pUser->session.retry.timeout = time(NULL) + PPPOE_MAX_TIMEOUT;
|
||||||
|
} else if (time(NULL) > pUser->session.retry.timeout) {
|
||||||
|
pUser->session.retry.timeout = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATUS_TASK_ERROR:
|
||||||
|
if (pUser->session.retry.timeout == 0) {
|
||||||
|
dzlog_error("User(%05d:%s) PPPoE dial error Invalid parameter\n",
|
||||||
|
pUser->userid,
|
||||||
|
pUser->user_info.pppoe_user);
|
||||||
|
// 10秒后尝试重新拨号
|
||||||
|
pUser->session.retry.timeout = time(NULL) + (PPPOE_MAX_TIMEOUT / 2);
|
||||||
|
pUser->session.retry.count = 0;
|
||||||
|
} else if (time(NULL) > pUser->session.retry.timeout) {
|
||||||
|
dzlog_warn("User(%05d:%s) retry dial %u times\n",
|
||||||
|
pUser->userid,
|
||||||
|
pUser->user_info.pppoe_user,
|
||||||
|
pUser->session.retry.count);
|
||||||
|
pUser->session.retry.timeout = 0;
|
||||||
|
pUser->session.retry.count++;
|
||||||
|
|
||||||
|
// 下次重新拨号
|
||||||
|
pSession->status = STATUS_TASK_DIAL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATUS_TASK_DISCONNECTED:
|
||||||
|
// 自动重新拨号
|
||||||
|
pSession->status = STATUS_TASK_DIAL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATUS_TASK_DELETE:
|
||||||
|
if (pUser->session.retry.timeout == 0) {
|
||||||
|
dzlog_debug("User(%05d:%s) PPPoE deleted\n", pUser->userid, pUser->user_info.pppoe_user);
|
||||||
|
pUser->session.retry.timeout = time(NULL);
|
||||||
|
pppapi_free(pUser->session.ppp);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#if 0
|
||||||
|
case STATUS_TASK_CONNECTED:
|
||||||
|
if (pUser->session.retry.timeout == 0) {
|
||||||
|
pUser->session.retry.timeout = time(NULL) + 30;
|
||||||
|
} else if (time(NULL) > pUser->session.retry.timeout) {
|
||||||
|
dzlog_debug("User(%05d:%s) PPPoE disconnected\n", pUser->userid, pUser->user_info.pppoe_user);
|
||||||
|
pSession->status = STATUS_TASK_DELETE;
|
||||||
|
pppapi_close(pUser->session.ppp, 0);
|
||||||
|
pUser->session.retry.timeout = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uv_rwlock_rdunlock(get_user_lock());
|
||||||
|
uv_sleep(1000);
|
||||||
|
} while (TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int pppoe_session_init() {
|
int pppoe_session_init() {
|
||||||
PUSER_INFO_LIST pList, pTmp;
|
static uv_thread_t uvThread;
|
||||||
PUSER_INFO_LIST pUserList = user_info_getall();
|
|
||||||
|
|
||||||
g_rawSocketIf = bind_rawsocket_if("ens160");
|
g_rawSocketIf = bind_rawsocket_if(config_get_nic_name());
|
||||||
|
|
||||||
if(g_rawSocketIf) {
|
if (g_rawSocketIf) {
|
||||||
dzlog_info("Create Raw Socket netif: <%p>\n", (void*)g_rawSocketIf);
|
dzlog_info("Create Raw Socket netif: <%p>\n", (void *)g_rawSocketIf);
|
||||||
}
|
}
|
||||||
|
|
||||||
HASH_ITER(hh, pUserList, pList, pTmp) {
|
// 启动Session状态机线程
|
||||||
PPPPOE_SESSION pSession = (PPPPOE_SESSION)malloc(sizeof(PPPOE_SESSION));
|
uv_thread_create(&uvThread, sessionCalcCb, NULL);
|
||||||
|
return ERR_SUCCESS;
|
||||||
if (pSession) {
|
}
|
||||||
struct netif *ppp_netif;
|
|
||||||
memset(pSession, 0, sizeof(PPPOE_SESSION));
|
int pppoe_session_create(PUSER_INFO_CONTEXT pUser) {
|
||||||
|
ppp_pcb *ppp;
|
||||||
ppp_netif = (struct netif *)malloc(sizeof(struct netif));
|
struct netif *netif;
|
||||||
|
struct netif *ppp_netif = (struct netif *)malloc(sizeof(struct netif));
|
||||||
if (ppp_netif) {
|
|
||||||
struct netif *netif;
|
if (ppp_netif == NULL) {
|
||||||
|
dzlog_error("Malloc %lu bytes memory error\n", sizeof(struct netif));
|
||||||
pSession->userid = pList->userid;
|
return -ERR_MALLOC_MEMORY;
|
||||||
memcpy(&pSession->user_info, &pList->user_info, sizeof(USER_INFO));
|
}
|
||||||
|
|
||||||
netif = create_pppoe_if(pSession);
|
netif = create_pppoe_if(pUser);
|
||||||
|
|
||||||
if (netif == NULL) {
|
if (netif == NULL) {
|
||||||
free(pSession);
|
dzlog_error("Create PPPoE netif error: %u\n", pUser->userid);
|
||||||
free(ppp_netif);
|
free((void *)ppp_netif);
|
||||||
dzlog_error("Create PPPoE netif error: %u\n", pList->userid);
|
return -ERR_CREATE_PPPOE_NETIF;
|
||||||
} else {
|
}
|
||||||
ppp_pcb *ppp;
|
|
||||||
|
pUser->session.nicif = netif;
|
||||||
pSession->nicif = netif;
|
pUser->session.pppif = ppp_netif;
|
||||||
pSession->pppif = ppp_netif;
|
|
||||||
|
ppp = pppapi_pppoe_create(pUser->session.pppif, pUser->session.nicif, NULL, NULL, pppLinkStatusCallback, pUser);
|
||||||
ppp = pppoe_create(pSession->pppif, pSession->nicif, NULL, NULL, pppLinkStatusCallback, NULL);
|
|
||||||
|
if (ppp == NULL) {
|
||||||
if (ppp == NULL) {
|
dzlog_error("Create PPPoE session error: %u\n", pUser->userid);
|
||||||
netif_remove(netif);
|
netif_remove(netif);
|
||||||
free(pSession);
|
free((void *)ppp_netif);
|
||||||
free(ppp_netif);
|
return -ERR_CREATE_PPP_SESSION;
|
||||||
dzlog_error("Create PPPoE netif error: %u\n", pList->userid);
|
}
|
||||||
} else {
|
|
||||||
|
pUser->session.ppp = ppp;
|
||||||
ppp_set_auth(ppp,
|
|
||||||
PPPAUTHTYPE_ANY,
|
ppp_set_auth(ppp, PPPAUTHTYPE_ANY, pUser->user_info.pppoe_user, pUser->user_info.pppoe_passwd);
|
||||||
pSession->user_info.pppoe_user,
|
|
||||||
pSession->user_info.pppoe_passwd);
|
dzlog_debug("Create PPPoE netif %p: %u(%c%c:%d, %c%c:%d)\n",
|
||||||
ppp_connect(ppp, 0);
|
ppp,
|
||||||
|
pUser->userid,
|
||||||
dzlog_info("Create PPPoE netif %p: %u(%c%c:%d, %c%c:%d)\n",
|
ppp_netif->name[0],
|
||||||
ppp,
|
ppp_netif->name[1],
|
||||||
pList->userid,
|
ppp_netif->num,
|
||||||
ppp_netif->name[0],
|
netif->name[0],
|
||||||
ppp_netif->name[1],
|
netif->name[1],
|
||||||
ppp_netif->num,
|
netif->num);
|
||||||
netif->name[0],
|
|
||||||
netif->name[1],
|
return ERR_SUCCESS;
|
||||||
netif->num);
|
}
|
||||||
HASH_ADD_INT(g_pSessionList, userid, pSession);
|
|
||||||
}
|
struct netif *get_rawsocket_if(void) {
|
||||||
}
|
return g_rawSocketIf;
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
}
|
|
@ -1,56 +1,132 @@
|
||||||
//
|
//
|
||||||
// Created by xajhuang on 2022/5/11.
|
// Created by xajhuang on 2022/5/11.
|
||||||
//
|
//
|
||||||
|
#include <misc.h>
|
||||||
#include "user_info.h"
|
#include "user_info.h"
|
||||||
#include "user_errno.h"
|
#include "user_errno.h"
|
||||||
|
|
||||||
static PUSER_INFO_LIST g_pUserList = NULL;
|
static PUSER_INFO_CONTEXT g_pUserList = NULL;
|
||||||
|
static uv_rwlock_t g_userLock;
|
||||||
|
|
||||||
static USER_INFO g_userInfo[] = {
|
static USER_INFO g_userInfo[] = {
|
||||||
{0, 1, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x02}, "xajhuang", "aaaHuang1"},
|
{0, 1, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x02}, "xajhuang3", "aaaHuang1", STATUS_USER_NEW},
|
||||||
{1, 2, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x03}, "xajhuang1", "aaaHuang1"},
|
{1, 2, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x03}, "xajhuang1", "aaaHuang1", STATUS_USER_NEW},
|
||||||
{3, 4, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x04}, "xajhuang2", "aaaHuang1"},
|
{3, 4, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x04}, "xajhuang2", "aaaHuang1", STATUS_USER_NEW},
|
||||||
};
|
};
|
||||||
|
|
||||||
void user_info_init() {
|
void user_info_init() {
|
||||||
|
uv_rwlock_init(&g_userLock);
|
||||||
|
|
||||||
user_info_add(0, &g_userInfo[0]);
|
user_info_add(0, &g_userInfo[0]);
|
||||||
user_info_add(1, &g_userInfo[1]);
|
user_info_add(1, &g_userInfo[1]);
|
||||||
user_info_add(2, &g_userInfo[2]);
|
user_info_add(2, &g_userInfo[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void user_info_change_status(PUSER_INFO pInfo, USER_STATUS status) {
|
||||||
|
pInfo->user_status = status;
|
||||||
|
}
|
||||||
|
|
||||||
int user_info_add(unsigned int userid, PUSER_INFO pInfo) {
|
int user_info_add(unsigned int userid, PUSER_INFO pInfo) {
|
||||||
|
PUSER_INFO_CONTEXT pUser;
|
||||||
|
|
||||||
|
uv_rwlock_rdlock(&g_userLock);
|
||||||
|
HASH_FIND_INT(g_pUserList, &userid, pUser);
|
||||||
|
uv_rwlock_rdunlock(&g_userLock);
|
||||||
|
|
||||||
|
if(pUser != NULL) {
|
||||||
|
return -ERR_ITEM_EXISTS;
|
||||||
|
}
|
||||||
|
|
||||||
if (pInfo) {
|
if (pInfo) {
|
||||||
PUSER_INFO_LIST pList = (PUSER_INFO_LIST)malloc(sizeof(USER_INFO_LIST));
|
PUSER_INFO_CONTEXT pList = (PUSER_INFO_CONTEXT)malloc(sizeof(USER_INFO_CONTEXT));
|
||||||
|
|
||||||
if (!pList) {
|
if (!pList) {
|
||||||
return ERR_MALLOC_MEMORY;
|
return ERR_MALLOC_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(pList, 0, sizeof(USER_INFO_CONTEXT));
|
||||||
|
|
||||||
pList->userid = userid;
|
pList->userid = userid;
|
||||||
pList->user_info.qinq_tag1 = pInfo->qinq_tag1;
|
pList->user_info.qinq_tag1 = pInfo->qinq_tag1;
|
||||||
pList->user_info.qinq_tag2 = pInfo->qinq_tag2;
|
pList->user_info.qinq_tag2 = pInfo->qinq_tag2;
|
||||||
pList->user_info.pppoe_user = strdup(pInfo->pppoe_user);
|
pList->user_info.pppoe_user = strdup(pInfo->pppoe_user);
|
||||||
pList->user_info.pppoe_passwd = strdup(pInfo->pppoe_passwd);
|
pList->user_info.pppoe_passwd = strdup(pInfo->pppoe_passwd);
|
||||||
|
pList->user_info.user_status = STATUS_USER_NEW;
|
||||||
memcpy(pList->user_info.mac_addr, pInfo->mac_addr, 6);
|
memcpy(pList->user_info.mac_addr, pInfo->mac_addr, 6);
|
||||||
|
|
||||||
|
pList->session.status = STATUS_TASK_INIT;
|
||||||
|
|
||||||
|
uv_rwlock_wrlock(&g_userLock);
|
||||||
HASH_ADD_INT(g_pUserList, userid, pList);
|
HASH_ADD_INT(g_pUserList, userid, pList);
|
||||||
|
uv_rwlock_wrunlock(&g_userLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ERR_OK;
|
return ERR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void user_info_remove(unsigned int userid) {
|
void user_info_remove(unsigned int userid) {
|
||||||
PUSER_INFO_LIST pInfo;
|
PUSER_INFO_CONTEXT pInfo;
|
||||||
|
|
||||||
|
uv_rwlock_rdlock(&g_userLock);
|
||||||
HASH_FIND_INT(g_pUserList, &userid, pInfo);
|
HASH_FIND_INT(g_pUserList, &userid, pInfo);
|
||||||
|
uv_rwlock_rdunlock(&g_userLock);
|
||||||
|
|
||||||
|
if (pInfo) {
|
||||||
|
pInfo->user_info.user_status = STATUS_USER_DELETE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void user_info_delete(unsigned int userid) {
|
||||||
|
PUSER_INFO_CONTEXT pInfo;
|
||||||
|
|
||||||
|
uv_rwlock_rdlock(&g_userLock);
|
||||||
|
HASH_FIND_INT(g_pUserList, &userid, pInfo);
|
||||||
|
uv_rwlock_rdunlock(&g_userLock);
|
||||||
|
|
||||||
if (pInfo) {
|
if (pInfo) {
|
||||||
HASH_DEL(g_pUserList, pInfo);
|
HASH_DEL(g_pUserList, pInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int user_info_modify(unsigned int userid, PUSER_INFO pUser) {
|
||||||
|
PUSER_INFO_CONTEXT pInfo;
|
||||||
|
|
||||||
|
uv_rwlock_rdlock(&g_userLock);
|
||||||
|
HASH_FIND_INT(g_pUserList, &userid, pInfo);
|
||||||
|
uv_rwlock_rdunlock(&g_userLock);
|
||||||
|
|
||||||
|
if (pInfo) {
|
||||||
|
int isUpgrade = FALSE;
|
||||||
|
|
||||||
|
if (memcmp(pInfo->user_info.mac_addr, pUser->mac_addr, 6) != 0) {
|
||||||
|
memcpy(pInfo->user_info.mac_addr, pUser->mac_addr, 6);
|
||||||
|
isUpgrade = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(pInfo->user_info.pppoe_user, pUser->pppoe_user) != 0) {
|
||||||
|
free((void*)pInfo->user_info.pppoe_user);
|
||||||
|
pInfo->user_info.pppoe_user = strdup(pUser->pppoe_user);
|
||||||
|
isUpgrade = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp(pInfo->user_info.pppoe_passwd, pUser->pppoe_passwd) != 0) {
|
||||||
|
free((void*)pInfo->user_info.pppoe_passwd);
|
||||||
|
pInfo->user_info.pppoe_passwd = strdup(pUser->pppoe_passwd);
|
||||||
|
isUpgrade = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isUpgrade) {
|
||||||
|
pInfo->user_info.user_status = STATUS_USER_MODIFY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ERR_SUCCESS;
|
||||||
|
} else {
|
||||||
|
return -ERR_ITEM_UNEXISTS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PUSER_INFO user_info_get_by_userid(unsigned int userid) {
|
PUSER_INFO user_info_get_by_userid(unsigned int userid) {
|
||||||
PUSER_INFO_LIST pInfo;
|
PUSER_INFO_CONTEXT pInfo;
|
||||||
|
|
||||||
HASH_FIND_INT(g_pUserList, &userid, pInfo);
|
HASH_FIND_INT(g_pUserList, &userid, pInfo);
|
||||||
|
|
||||||
|
@ -61,6 +137,10 @@ PUSER_INFO user_info_get_by_userid(unsigned int userid) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
PUSER_INFO_LIST user_info_getall() {
|
PUSER_INFO_CONTEXT get_all_user() {
|
||||||
return g_pUserList;
|
return g_pUserList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uv_rwlock_t* get_user_lock() {
|
||||||
|
return &g_userLock;
|
||||||
|
}
|
|
@ -2,6 +2,7 @@
|
||||||
// Created by xajhu on 2021/6/29 0029.
|
// Created by xajhu on 2021/6/29 0029.
|
||||||
//
|
//
|
||||||
#include <uv.h>
|
#include <uv.h>
|
||||||
|
#include <zlog.h>
|
||||||
|
|
||||||
#include "cmdline.h"
|
#include "cmdline.h"
|
||||||
#include "task_manager.h"
|
#include "task_manager.h"
|
||||||
|
@ -10,6 +11,7 @@
|
||||||
#include "pppoe_session.h"
|
#include "pppoe_session.h"
|
||||||
#include "lwip/sys.h"
|
#include "lwip/sys.h"
|
||||||
#include "lwip/tcpip.h"
|
#include "lwip/tcpip.h"
|
||||||
|
#include "netif/rawif.h"
|
||||||
|
|
||||||
static void test_init(void *arg) { /* remove compiler warning */
|
static void test_init(void *arg) { /* remove compiler warning */
|
||||||
sys_sem_t *init_sem;
|
sys_sem_t *init_sem;
|
||||||
|
@ -42,7 +44,7 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
lwip_init_env();
|
lwip_init_env();
|
||||||
user_info_init();
|
user_info_init();
|
||||||
pppoe_session_init();
|
pppoe_session_init(NULL);
|
||||||
|
|
||||||
task_manager_run();
|
task_manager_run();
|
||||||
user_uninit();
|
user_uninit();
|
||||||
|
|
Loading…
Reference in New Issue