REM:
1. 增加PPPoE用户自动拨号,以及状态机功能
2. 优化rawif网卡接收数据包,对非业务信息进行过滤
3. 增加网卡名称,是否支持vxlan等配置项
4. 重构pppoeif接口初始化逻辑以及参数
This commit is contained in:
huangxin 2022-06-02 16:18:43 +08:00
parent 33449cac5d
commit 757b3f1bb7
15 changed files with 505 additions and 285 deletions

72
srcs/include/pppoe_info.h Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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封装
}
} }

View File

@ -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) {

View File

@ -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);
} }

View File

@ -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

View File

@ -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 */

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;
} }

View File

@ -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;
}

View File

@ -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();