OCT
REM: 1. 增加Agent数据收发通道 2. 增加PPPoE拨号后发送PPPoE相关数据给Agent 3. 增加网卡网卡拦截数据包接口
This commit is contained in:
parent
757b3f1bb7
commit
a3644c46aa
|
@ -11,6 +11,8 @@ extern "C" {
|
|||
#include "netif/ppp/ppp.h"
|
||||
|
||||
#define PPPOE_MAX_TIMEOUT (30)
|
||||
#define MAX_IP_V4_STR (16)
|
||||
#define MAX_MAC_ADDR_STR (18)
|
||||
|
||||
typedef enum {
|
||||
STATUS_TASK_INIT,
|
||||
|
@ -34,6 +36,15 @@ typedef struct {
|
|||
unsigned int count;
|
||||
} RETRY_WORK;
|
||||
|
||||
typedef struct {
|
||||
unsigned short sessionId;
|
||||
char clientIp[MAX_IP_V4_STR];
|
||||
char clientGw[MAX_IP_V4_STR];
|
||||
char clientMask[MAX_IP_V4_STR];
|
||||
char clientMac[MAX_MAC_ADDR_STR];
|
||||
char localMac[MAX_MAC_ADDR_STR];
|
||||
} PPPOE_SESSION_DATA, *PPPPOE_SESSION_DATA;
|
||||
|
||||
typedef struct {
|
||||
unsigned int userid;
|
||||
struct netif *nicif;
|
||||
|
@ -42,24 +53,43 @@ typedef struct {
|
|||
|
||||
RETRY_WORK retry;
|
||||
|
||||
PPPOE_SESSION_DATA data;
|
||||
|
||||
PPPOE_TASK status;
|
||||
} PPPOE_SESSION, *PPPPOE_SESSION;
|
||||
|
||||
typedef struct {
|
||||
unsigned short qinq_tag1;
|
||||
unsigned short qinq_tag2;
|
||||
unsigned int userid;
|
||||
unsigned int vni;
|
||||
unsigned short q1;
|
||||
unsigned short q2;
|
||||
unsigned char mac_addr[6];
|
||||
const char *pppoe_user;
|
||||
const char *pppoe_passwd;
|
||||
} USER_PARAMS, *PUSER_PARAMS;
|
||||
|
||||
typedef struct {
|
||||
unsigned int vni;
|
||||
unsigned short q1;
|
||||
unsigned short q2;
|
||||
} VXLAN_TAG, *PVXLAN_TAG;
|
||||
|
||||
typedef struct {
|
||||
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;
|
||||
VXLAN_TAG vxlan;
|
||||
USER_INFO user_info;
|
||||
PPPOE_SESSION session;
|
||||
|
||||
UT_hash_handle hh;
|
||||
USER_STATUS user_status;
|
||||
|
||||
UT_hash_handle hh_id;
|
||||
UT_hash_handle hh_vxlan;
|
||||
} USER_INFO_CONTEXT, *PUSER_INFO_CONTEXT;
|
||||
|
||||
int pppoe_session_create(PUSER_INFO_CONTEXT pUser);
|
||||
|
|
|
@ -11,11 +11,11 @@ extern "C" {
|
|||
#include "pppoe_info.h"
|
||||
|
||||
void user_info_init();
|
||||
int user_info_add(unsigned int userid, PUSER_INFO pInfo);
|
||||
int user_info_add(unsigned int userid, PUSER_PARAMS pInfo);
|
||||
void user_info_remove(unsigned int userid);
|
||||
void user_info_delete(unsigned int userid);
|
||||
PUSER_INFO user_info_get_by_userid(unsigned int userid);
|
||||
void user_info_change_status(PUSER_INFO pInfo, USER_STATUS status);
|
||||
void user_info_change_status(PUSER_INFO_CONTEXT pInfo, USER_STATUS status);
|
||||
PUSER_INFO_CONTEXT get_all_user();
|
||||
uv_rwlock_t* get_user_lock();
|
||||
#ifdef __cplusplus
|
||||
|
|
|
@ -45,6 +45,7 @@ application:
|
|||
zero_mq:
|
||||
{
|
||||
svr_port = 6278; # ZeroMQ 服务器端口
|
||||
agent_port = 6279; # Agetn 通信端口
|
||||
};
|
||||
|
||||
# 网络相关
|
||||
|
|
|
@ -479,8 +479,8 @@ do {
|
|||
ADD_CFG_ITEM(CFG_DB_MYSQL_DB_NAME, "application.database.mysql_database", VALUE_TYPE_STRING, ".main", "MySQL database used"); \
|
||||
/* 消息队列相配置 */ \
|
||||
/* 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, "6278", "ZeroMQ server port"); \
|
||||
ADD_CFG_ITEM(CFG_MQ_DATA_CH, "application.zero_mq.agent_port", VALUE_TYPE_INTEGRAL, "6279", "ZeroMQ Agent 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
|
||||
|
|
|
@ -98,3 +98,7 @@ const char *cfg_get_mysql_database() {
|
|||
int cfg_get_zero_mq_port() {
|
||||
return (unsigned short)cfg_get_integral_value(CFG_MQ_SVR_PORT);
|
||||
}
|
||||
|
||||
int cfg_get_zero_mq_data_channel() {
|
||||
return (unsigned short)cfg_get_integral_value(CFG_MQ_DATA_CH);
|
||||
}
|
|
@ -41,8 +41,9 @@ typedef enum {
|
|||
CFG_DB_MYSQL_PASSWD = 19,
|
||||
CFG_DB_MYSQL_DB_NAME = 20,
|
||||
CFG_MQ_SVR_PORT = 21,
|
||||
CFG_NIC_CARD_NAME = 22,
|
||||
CFG_VXLAN_SUPPORT = 23,
|
||||
CFG_MQ_DATA_CH = 22,
|
||||
CFG_NIC_CARD_NAME = 23,
|
||||
CFG_VXLAN_SUPPORT = 24,
|
||||
|
||||
CONFIG_ITEM_ID_MAX
|
||||
} CONFIG_ITEM_ID;
|
||||
|
@ -71,6 +72,7 @@ const char *cfg_get_mysql_user();
|
|||
const char *cfg_get_mysql_passwd();
|
||||
const char *cfg_get_mysql_database();
|
||||
int cfg_get_zero_mq_port();
|
||||
int cfg_get_zero_mq_data_channel();
|
||||
|
||||
const char *cfg_get_string_value(CONFIG_ITEM_ID id);
|
||||
long double cfg_get_float_value(CONFIG_ITEM_ID id);
|
||||
|
|
|
@ -10,6 +10,8 @@ extern "C" {
|
|||
|
||||
#include "misc.h"
|
||||
|
||||
typedef const char *(*DATACHNNELCB)(const char *pMsg, void *pArgs);
|
||||
|
||||
typedef struct {
|
||||
char cmd[MAX_PATH];
|
||||
char key[MAX_PATH];
|
||||
|
@ -20,6 +22,9 @@ int mq_init(void);
|
|||
void mq_uninit(void);
|
||||
|
||||
const char *on_msg_cmd(const char *pCmd);
|
||||
int mq_data_init(DATACHNNELCB dataCb);
|
||||
int mq_data_send_msg(const char *pMsg);
|
||||
void *get_mq_context(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -0,0 +1,105 @@
|
|||
//
|
||||
// Created by xajhuang on 2022/6/6.
|
||||
//
|
||||
#include <stdlib.h>
|
||||
#include <zmq.h>
|
||||
#include <uv.h>
|
||||
#include <string.h>
|
||||
#include <zlog.h>
|
||||
|
||||
#include "msg_queue.h"
|
||||
#include "config.h"
|
||||
#include "user_errno.h"
|
||||
#include "misc.h"
|
||||
|
||||
static void *g_pDataCh = NULL;
|
||||
static DATACHNNELCB g_pDataChCb = NULL;
|
||||
|
||||
static void process_data_msg(void *pDataCh, zmq_msg_t *pMsg) {
|
||||
const char *pResp;
|
||||
zmq_msg_t msg;
|
||||
const char *pRecMsg = strdup((const char *)zmq_msg_data(pMsg));
|
||||
|
||||
dzlog_info("receive(%zu): %s\n", zmq_msg_size(pMsg), pRecMsg);
|
||||
zmq_msg_close(pMsg);
|
||||
|
||||
if (g_pDataChCb) {
|
||||
pResp = g_pDataChCb(pRecMsg, pDataCh);
|
||||
|
||||
if (pResp != NULL && strlen(pResp) > 0) {
|
||||
zmq_msg_init_size(&msg, strlen(pResp) + 1);
|
||||
memcpy(zmq_msg_data(&msg), pResp, strlen(pResp));
|
||||
zmq_msg_send(&msg, pDataCh, 0);
|
||||
free((void *)pResp);
|
||||
}
|
||||
|
||||
zmq_msg_close(&msg);
|
||||
} else {
|
||||
dzlog_warn("Unhandled message: %s\n", pRecMsg);
|
||||
}
|
||||
|
||||
free((void *)pRecMsg);
|
||||
}
|
||||
|
||||
int mq_data_send_msg(const char *pMsg) {
|
||||
zmq_msg_t msg;
|
||||
|
||||
if (pMsg) {
|
||||
dzlog_debug("Send PPPoE Session:\n%s\n", pMsg);
|
||||
zmq_msg_init_size(&msg, strlen(pMsg) + 1);
|
||||
memcpy(zmq_msg_data(&msg), pMsg, strlen(pMsg));
|
||||
zmq_msg_send(&msg, g_pDataCh, 0);
|
||||
zmq_msg_close(&msg);
|
||||
}
|
||||
|
||||
return ERR_SUCCESS;
|
||||
}
|
||||
|
||||
_Noreturn static void mqDataChannelCb(void *pDataCh) {
|
||||
while (TRUE) {
|
||||
zmq_msg_t msg;
|
||||
zmq_msg_init(&msg);
|
||||
|
||||
if (zmq_msg_recv(&msg, pDataCh, 0) != -1) {
|
||||
process_data_msg(pDataCh, &msg);
|
||||
zmq_msg_close(&msg);
|
||||
}
|
||||
|
||||
uv_sleep(10);
|
||||
}
|
||||
}
|
||||
|
||||
int mq_data_init(DATACHNNELCB dataCb) {
|
||||
static uv_thread_t uvThread;
|
||||
void *pContext = get_mq_context();
|
||||
|
||||
char buf[1024];
|
||||
|
||||
if (pContext == NULL) {
|
||||
return -ERR_MQ_CREATE_MQ;
|
||||
}
|
||||
|
||||
g_pDataChCb = dataCb;
|
||||
|
||||
g_pDataCh = zmq_socket(pContext, ZMQ_PAIR);
|
||||
|
||||
if (g_pDataCh == NULL) {
|
||||
zmq_ctx_destroy(g_pDataCh);
|
||||
return -ERR_MQ_CREATE_REP;
|
||||
}
|
||||
|
||||
memset(buf, 0, 1024);
|
||||
|
||||
sprintf(buf, "tcp://*:%d", cfg_get_zero_mq_data_channel());
|
||||
dzlog_info("Start message queue server: tcp://*:%d\n", cfg_get_zero_mq_data_channel());
|
||||
|
||||
if (zmq_bind(g_pDataCh, buf) != 0) {
|
||||
zmq_close(g_pDataCh);
|
||||
zmq_ctx_destroy(g_pDataCh);
|
||||
return -ERR_MQ_BIND_SOCKET;
|
||||
}
|
||||
|
||||
uv_thread_create(&uvThread, mqDataChannelCb, g_pDataCh);
|
||||
|
||||
return ERR_SUCCESS;
|
||||
}
|
|
@ -105,6 +105,10 @@ int mq_init(void) {
|
|||
return ERR_SUCCESS;
|
||||
}
|
||||
|
||||
void* get_mq_context() {
|
||||
return g_pContext;
|
||||
}
|
||||
|
||||
void mq_uninit(void) {
|
||||
g_mqExit = TRUE;
|
||||
}
|
||||
|
|
|
@ -52,8 +52,10 @@
|
|||
#include "lwip/sys.h"
|
||||
|
||||
#include "netif/etharp.h"
|
||||
|
||||
#include "netif/rawif.h"
|
||||
|
||||
#include "lwip/prot/udp.h"
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#if defined(LWIP_UNIX_LINUX)
|
||||
|
@ -70,6 +72,8 @@
|
|||
|
||||
#define DEFAULT_GW_IPADDR (0xC0A80001)
|
||||
|
||||
#define VXLAN_PORT_NET_ORDER (0x12B5)
|
||||
|
||||
struct sockaddr_ll {
|
||||
unsigned short int sll_family;
|
||||
unsigned short int sll_protocol;
|
||||
|
@ -262,8 +266,7 @@ static struct pbuf *low_level_input(struct netif *netif) {
|
|||
}
|
||||
len = (u16_t)readlen;
|
||||
|
||||
if ((buf[0] == 0x00 && buf[1] == 0x0C && buf[2] == 0x01 && buf[3] == 0x02)
|
||||
|| memcmp(buf, bmac, 6) == 0) {
|
||||
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);
|
||||
|
||||
/* We allocate a pbuf chain of pbufs from the pool. */
|
||||
|
@ -326,8 +329,6 @@ static void rawif_input(struct netif *netif) {
|
|||
err_t rawif_init(struct netif *netif) {
|
||||
struct rawif *rawif = (struct rawif *)netif->state;
|
||||
|
||||
dzlog_debug("++++++++++++rawif<%p>\n", (void *)rawif);
|
||||
|
||||
if (rawif == NULL) {
|
||||
LWIP_DEBUGF(NETIF_DEBUG, ("rawif_init: out of memory for rawif\n"));
|
||||
return ERR_MEM;
|
||||
|
@ -407,8 +408,29 @@ static void link_callback(struct netif *state_netif) {
|
|||
|
||||
static err_t netif_input_data(struct pbuf *p, struct netif *inp) {
|
||||
struct netif *netif;
|
||||
struct rawif *rawif = (struct rawif *)inp->state;
|
||||
unsigned char buf[1500];
|
||||
unsigned char *payload = (unsigned char *)p->payload;
|
||||
|
||||
LWIP_ASSERT_CORE_LOCKED();
|
||||
|
||||
// 网卡支持vxlan
|
||||
if (rawif->vxlan_support) {
|
||||
const struct eth_hdr *ethhdr = (const struct eth_hdr *)payload;
|
||||
const struct ip_hdr *iphdr = (const struct ip_hdr *)(payload + SIZEOF_ETH_HDR);
|
||||
const struct udp_hdr *udphdr = (const struct udp_hdr *)(payload + SIZEOF_ETH_HDR + IPH_HL_BYTES(iphdr));
|
||||
|
||||
// UDP xvLan 数据包
|
||||
if (udphdr->dest == VXLAN_PORT_NET_ORDER) {
|
||||
// 首包
|
||||
if (rawif->vxlan_buf.input_head == NULL) {
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
NETIF_FOREACH(netif) {
|
||||
err_t err;
|
||||
unsigned char *pMac = (unsigned char *)p->payload;
|
||||
|
@ -487,7 +509,6 @@ struct netif *bind_rawsocket_if(const char *eth_name) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
dzlog_debug("++++++++++++rawif<%p>\n", (void *)rawif);
|
||||
netif_add(netif, &ipaddr, &netmask, &gw, rawif, rawif_init, netif_input_data);
|
||||
|
||||
#if LWIP_NETIF_STATUS_CALLBACK
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
//
|
||||
// Created by xajhuang on 2022/6/6.
|
||||
//
|
|
@ -4,6 +4,8 @@
|
|||
#include <zlog.h>
|
||||
#include <uv/unix.h>
|
||||
#include <uv.h>
|
||||
#include <uthash/utlist.h>
|
||||
#include <cjson/cJSON.h>
|
||||
#include "pppoe_session.h"
|
||||
#include "netif/rawif.h"
|
||||
#include "netif/ppp/ppp.h"
|
||||
|
@ -13,6 +15,13 @@
|
|||
#include "user_errno.h"
|
||||
#include "netif/ppp/pppapi.h"
|
||||
#include "config.h"
|
||||
#include "msg_queue.h"
|
||||
|
||||
typedef struct PPPOE_CACHE {
|
||||
PPPPOE_SESSION_DATA pSessionData;
|
||||
|
||||
struct PPPOE_CACHE *next, *prev;
|
||||
} PPPOE_CACHE, *PPPPOE_CACHE;
|
||||
|
||||
struct PPPOE_ERR_INFO_ {
|
||||
int errid;
|
||||
|
@ -34,6 +43,8 @@ struct PPPOE_ERR_INFO_ {
|
|||
};
|
||||
|
||||
static struct netif *g_rawSocketIf = NULL;
|
||||
static PPPPOE_CACHE g_pPPPCache = NULL;
|
||||
static uv_rwlock_t g_cacheLock;
|
||||
|
||||
static void pppLinkStatusCallback(ppp_pcb *pcb, int errCode, void *ctx) {
|
||||
struct netif *pppif = ppp_netif(pcb);
|
||||
|
@ -42,15 +53,30 @@ static void pppLinkStatusCallback(ppp_pcb *pcb, int errCode, void *ctx) {
|
|||
|
||||
switch (errCode) {
|
||||
case PPPERR_NONE: { /* No error. */
|
||||
PPPPOE_CACHE pCache = (PPPPOE_CACHE)malloc(sizeof(PPPOE_CACHE));
|
||||
dzlog_info("<%p> PPPoE user(%05d:%s) connect server succeeded[%08X], Session: %04X\n",
|
||||
pcb,
|
||||
pUser->userid, pUser->user_info.pppoe_user,
|
||||
pUser->userid,
|
||||
pUser->user_info.pppoe_user,
|
||||
pcb->lcp_gotoptions.magicnumber,
|
||||
sc->sc_session);
|
||||
#if LWIP_IPV4
|
||||
dzlog_info(" our_ipaddr = %s\n", ip4addr_ntoa(netif_ip4_addr(pppif)));
|
||||
dzlog_info(" his_ipaddr = %s\n", ip4addr_ntoa(netif_ip4_gw(pppif)));
|
||||
dzlog_info(" netmask = %s\n", ip4addr_ntoa(netif_ip4_netmask(pppif)));
|
||||
memset(&pUser->session.data, 0, sizeof(PPPOE_SESSION_DATA));
|
||||
pUser->session.data.sessionId = sc->sc_session;
|
||||
strncpy(pUser->session.data.clientIp, ip4addr_ntoa(netif_ip4_addr(pppif)), MAX_IP_V4_STR);
|
||||
strncpy(pUser->session.data.clientGw, ip4addr_ntoa(netif_ip4_gw(pppif)), MAX_IP_V4_STR);
|
||||
strncpy(pUser->session.data.clientMask, ip4addr_ntoa(netif_ip4_netmask(pppif)), MAX_IP_V4_STR);
|
||||
sprintf(pUser->session.data.clientMac,
|
||||
"%02X:%02X:%02X:%02X:%02X:%02X",
|
||||
pUser->user_info.mac_addr[0],
|
||||
pUser->user_info.mac_addr[1],
|
||||
pUser->user_info.mac_addr[2],
|
||||
pUser->user_info.mac_addr[3],
|
||||
pUser->user_info.mac_addr[4],
|
||||
pUser->user_info.mac_addr[5]);
|
||||
dzlog_info(" our_ipaddr = %s\n", pUser->session.data.clientIp);
|
||||
dzlog_info(" his_ipaddr = %s\n", pUser->session.data.clientGw);
|
||||
dzlog_info(" netmask = %s\n", pUser->session.data.clientMask);
|
||||
#endif /* LWIP_IPV4 */
|
||||
#if LWIP_DNS
|
||||
dzlog_info(" dns1 = %s\n", ipaddr_ntoa(dns_getserver(0)));
|
||||
|
@ -59,6 +85,13 @@ static void pppLinkStatusCallback(ppp_pcb *pcb, int errCode, void *ctx) {
|
|||
#if PPP_IPV6_SUPPORT
|
||||
dzlog_info(" our6_ipaddr = %s\n", ip6addr_ntoa(netif_ip6_addr(pppif, 0)));
|
||||
#endif /* PPP_IPV6_SUPPORT */
|
||||
|
||||
if (pCache) {
|
||||
pCache->pSessionData = &pUser->session.data;
|
||||
uv_rwlock_wrlock(&g_cacheLock);
|
||||
LL_APPEND(g_pPPPCache, pCache);
|
||||
uv_rwlock_wrunlock(&g_cacheLock);
|
||||
}
|
||||
pUser->session.status = STATUS_TASK_CONNECTED;
|
||||
break;
|
||||
}
|
||||
|
@ -106,7 +139,7 @@ _Noreturn void sessionCalcCb(void *UNUSED(pArg)) {
|
|||
PUSER_INFO_CONTEXT pUser, pTmp;
|
||||
|
||||
uv_rwlock_rdlock(get_user_lock());
|
||||
HASH_ITER(hh, pUserList, pUser, pTmp) {
|
||||
HASH_ITER(hh_id, pUserList, pUser, pTmp) {
|
||||
PPPPOE_SESSION pSession = &pUser->session;
|
||||
|
||||
switch (pSession->status) {
|
||||
|
@ -168,6 +201,7 @@ _Noreturn void sessionCalcCb(void *UNUSED(pArg)) {
|
|||
pppapi_close(pUser->session.ppp, 0);
|
||||
pUser->session.retry.timeout = 0;
|
||||
}
|
||||
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
|
@ -179,8 +213,46 @@ _Noreturn void sessionCalcCb(void *UNUSED(pArg)) {
|
|||
} while (TRUE);
|
||||
}
|
||||
|
||||
_Noreturn void cacheCalcCb(void *UNUSED(pArg)) {
|
||||
do {
|
||||
PPPPOE_CACHE pCache, pTmp;
|
||||
int count;
|
||||
|
||||
uv_rwlock_rdlock(&g_cacheLock);
|
||||
LL_COUNT(g_pPPPCache, pCache, count);
|
||||
uv_rwlock_rdunlock(&g_cacheLock);
|
||||
|
||||
if (count > 0) {
|
||||
cJSON *pRoot = cJSON_CreateObject();
|
||||
cJSON *pSession = cJSON_CreateArray();
|
||||
cJSON_AddStringToObject(pRoot, "message", "add-ywg-pppoe");
|
||||
|
||||
uv_rwlock_wrlock(&g_cacheLock);
|
||||
LL_FOREACH_SAFE(g_pPPPCache, pCache, pTmp) {
|
||||
cJSON *pItem = cJSON_CreateObject();
|
||||
cJSON_AddNumberToObject(pItem, "sessionId", pCache->pSessionData->sessionId);
|
||||
cJSON_AddStringToObject(pItem, "clientIp", pCache->pSessionData->clientIp);
|
||||
cJSON_AddStringToObject(pItem, "clientGw", pCache->pSessionData->clientGw);
|
||||
cJSON_AddStringToObject(pItem, "clientMask", pCache->pSessionData->clientMask);
|
||||
cJSON_AddStringToObject(pItem, "clientMac", pCache->pSessionData->clientMac);
|
||||
cJSON_AddStringToObject(pItem, "localMac", pCache->pSessionData->localMac);
|
||||
cJSON_AddItemToArray(pSession, pItem);
|
||||
LL_DELETE(g_pPPPCache, pCache);
|
||||
free(pCache);
|
||||
}
|
||||
uv_rwlock_wrunlock(&g_cacheLock);
|
||||
cJSON_AddItemToObject(pRoot, "params", pSession);
|
||||
mq_data_send_msg(cJSON_Print(pRoot));
|
||||
cJSON_Delete(pRoot);
|
||||
}
|
||||
|
||||
uv_sleep(1000);
|
||||
} while (TRUE);
|
||||
}
|
||||
|
||||
int pppoe_session_init() {
|
||||
static uv_thread_t uvThread;
|
||||
static uv_thread_t uvThread, cacheThread;
|
||||
uv_rwlock_init(&g_cacheLock);
|
||||
|
||||
g_rawSocketIf = bind_rawsocket_if(config_get_nic_name());
|
||||
|
||||
|
@ -190,6 +262,7 @@ int pppoe_session_init() {
|
|||
|
||||
// 启动Session状态机线程
|
||||
uv_thread_create(&uvThread, sessionCalcCb, NULL);
|
||||
uv_thread_create(&cacheThread, cacheCalcCb, NULL);
|
||||
return ERR_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,13 +5,14 @@
|
|||
#include "user_info.h"
|
||||
#include "user_errno.h"
|
||||
|
||||
static PUSER_INFO_CONTEXT g_pUserList = NULL;
|
||||
static PUSER_INFO_CONTEXT g_pUserByIdList = NULL;
|
||||
static PUSER_INFO_CONTEXT g_pUserByTagsList = NULL;
|
||||
static uv_rwlock_t g_userLock;
|
||||
|
||||
static USER_INFO g_userInfo[] = {
|
||||
{0, 1, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x02}, "xajhuang3", "aaaHuang1", STATUS_USER_NEW},
|
||||
{1, 2, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x03}, "xajhuang1", "aaaHuang1", STATUS_USER_NEW},
|
||||
{3, 4, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x04}, "xajhuang2", "aaaHuang1", STATUS_USER_NEW},
|
||||
static USER_PARAMS g_userInfo[] = {
|
||||
{0, 100, 16, 12, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x02}, "xajhuang3", "aaaHuang1"},
|
||||
{1, 200, 24, 371, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x03}, "xajhuang1", "aaaHuang1"},
|
||||
{2, 300, 14, 15, {0x00, 0x0C, 0x01, 0x02, 0x00, 0x04}, "xajhuang2", "aaaHuang1"},
|
||||
};
|
||||
|
||||
void user_info_init() {
|
||||
|
@ -22,18 +23,18 @@ void user_info_init() {
|
|||
user_info_add(2, &g_userInfo[2]);
|
||||
}
|
||||
|
||||
void user_info_change_status(PUSER_INFO pInfo, USER_STATUS status) {
|
||||
void user_info_change_status(PUSER_INFO_CONTEXT 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_PARAMS pInfo) {
|
||||
PUSER_INFO_CONTEXT pUser;
|
||||
|
||||
uv_rwlock_rdlock(&g_userLock);
|
||||
HASH_FIND_INT(g_pUserList, &userid, pUser);
|
||||
HASH_FIND(hh_id, g_pUserByIdList, &userid, sizeof(unsigned int), pUser);
|
||||
uv_rwlock_rdunlock(&g_userLock);
|
||||
|
||||
if(pUser != NULL) {
|
||||
if (pUser != NULL) {
|
||||
return -ERR_ITEM_EXISTS;
|
||||
}
|
||||
|
||||
|
@ -46,18 +47,20 @@ int user_info_add(unsigned int userid, PUSER_INFO pInfo) {
|
|||
|
||||
memset(pList, 0, sizeof(USER_INFO_CONTEXT));
|
||||
|
||||
pList->user_status = STATUS_USER_NEW;
|
||||
pList->userid = userid;
|
||||
pList->user_info.qinq_tag1 = pInfo->qinq_tag1;
|
||||
pList->user_info.qinq_tag2 = pInfo->qinq_tag2;
|
||||
pList->vxlan.vni = pInfo->vni;
|
||||
pList->vxlan.q1 = pInfo->q1;
|
||||
pList->vxlan.q2 = pInfo->q2;
|
||||
pList->user_info.pppoe_user = strdup(pInfo->pppoe_user);
|
||||
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);
|
||||
|
||||
pList->session.status = STATUS_TASK_INIT;
|
||||
|
||||
uv_rwlock_wrlock(&g_userLock);
|
||||
HASH_ADD_INT(g_pUserList, userid, pList);
|
||||
HASH_ADD(hh_id, g_pUserByIdList, userid, sizeof(unsigned int), pList);
|
||||
HASH_ADD(hh_vxlan, g_pUserByTagsList, vxlan, sizeof(VXLAN_TAG), pList);
|
||||
uv_rwlock_wrunlock(&g_userLock);
|
||||
}
|
||||
|
||||
|
@ -68,11 +71,11 @@ void user_info_remove(unsigned int userid) {
|
|||
PUSER_INFO_CONTEXT pInfo;
|
||||
|
||||
uv_rwlock_rdlock(&g_userLock);
|
||||
HASH_FIND_INT(g_pUserList, &userid, pInfo);
|
||||
HASH_FIND(hh_id, g_pUserByIdList, &userid, sizeof(unsigned int), pInfo);
|
||||
uv_rwlock_rdunlock(&g_userLock);
|
||||
|
||||
if (pInfo) {
|
||||
pInfo->user_info.user_status = STATUS_USER_DELETE;
|
||||
pInfo->user_status = STATUS_USER_DELETE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -80,11 +83,12 @@ void user_info_delete(unsigned int userid) {
|
|||
PUSER_INFO_CONTEXT pInfo;
|
||||
|
||||
uv_rwlock_rdlock(&g_userLock);
|
||||
HASH_FIND_INT(g_pUserList, &userid, pInfo);
|
||||
HASH_FIND(hh_id, g_pUserByIdList, &userid, sizeof(unsigned int), pInfo);
|
||||
uv_rwlock_rdunlock(&g_userLock);
|
||||
|
||||
if (pInfo) {
|
||||
HASH_DEL(g_pUserList, pInfo);
|
||||
HASH_DELETE(hh_id, g_pUserByIdList, pInfo);
|
||||
HASH_DELETE(hh_vxlan, g_pUserByTagsList, pInfo);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -92,7 +96,7 @@ 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);
|
||||
HASH_FIND(hh_id, g_pUserByIdList, &userid, sizeof(unsigned int), pInfo);
|
||||
uv_rwlock_rdunlock(&g_userLock);
|
||||
|
||||
if (pInfo) {
|
||||
|
@ -104,19 +108,19 @@ int user_info_modify(unsigned int userid, PUSER_INFO pUser) {
|
|||
}
|
||||
|
||||
if (strcmp(pInfo->user_info.pppoe_user, pUser->pppoe_user) != 0) {
|
||||
free((void*)pInfo->user_info.pppoe_user);
|
||||
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);
|
||||
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;
|
||||
pInfo->user_status = STATUS_USER_MODIFY;
|
||||
}
|
||||
|
||||
return ERR_SUCCESS;
|
||||
|
@ -128,7 +132,7 @@ int user_info_modify(unsigned int userid, PUSER_INFO pUser) {
|
|||
PUSER_INFO user_info_get_by_userid(unsigned int userid) {
|
||||
PUSER_INFO_CONTEXT pInfo;
|
||||
|
||||
HASH_FIND_INT(g_pUserList, &userid, pInfo);
|
||||
HASH_FIND(hh_id, g_pUserByIdList, &userid, sizeof(unsigned int), pInfo);
|
||||
|
||||
if (pInfo) {
|
||||
return &pInfo->user_info;
|
||||
|
@ -138,9 +142,9 @@ PUSER_INFO user_info_get_by_userid(unsigned int userid) {
|
|||
}
|
||||
|
||||
PUSER_INFO_CONTEXT get_all_user() {
|
||||
return g_pUserList;
|
||||
return g_pUserByIdList;
|
||||
}
|
||||
|
||||
uv_rwlock_t* get_user_lock() {
|
||||
uv_rwlock_t *get_user_lock() {
|
||||
return &g_userLock;
|
||||
}
|
Loading…
Reference in New Issue