OCT 1. 增加 DHCP 服务识别 IPTV
2. 更新 DHCP 服务包过滤器,支持,VLAN,双层VLAN以及不带VLAN
This commit is contained in:
parent
8ee1d22c8d
commit
a966345329
|
@ -100,7 +100,7 @@ application:
|
||||||
# MAC地址黑名单
|
# MAC地址黑名单
|
||||||
# mac_filter = ["00:01:02:03:04:07", "00:01:02:03:04:01"];
|
# mac_filter = ["00:01:02:03:04:07", "00:01:02:03:04:01"];
|
||||||
# 数据包过滤器
|
# 数据包过滤器
|
||||||
net_filter = "vlan or (udp and dst port 67)";
|
net_filter = " (udp and dst port 67) or vlan";
|
||||||
# IP地址池配置
|
# IP地址池配置
|
||||||
range_set: (
|
range_set: (
|
||||||
{ dhcp_range = "192.168.101.2-192.168.101.40";
|
{ dhcp_range = "192.168.101.2-192.168.101.40";
|
||||||
|
|
|
@ -6,8 +6,6 @@
|
||||||
#include "user_errno.h"
|
#include "user_errno.h"
|
||||||
#include "database.h"
|
#include "database.h"
|
||||||
#include "dhcp_network.h"
|
#include "dhcp_network.h"
|
||||||
#include "rfc2131.h"
|
|
||||||
#include "ip_pool.h"
|
|
||||||
#include "db_interface.h"
|
#include "db_interface.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "zlog_module.h"
|
#include "zlog_module.h"
|
||||||
|
@ -53,6 +51,18 @@
|
||||||
" createTm TIMESTAMP DEFAULT (datetime('now', 'localtime')) NOT NULL" \
|
" createTm TIMESTAMP DEFAULT (datetime('now', 'localtime')) NOT NULL" \
|
||||||
"); CREATE INDEX IF NOT EXISTS pre_assign_index ON pre_assign(ip, uid);"
|
"); CREATE INDEX IF NOT EXISTS pre_assign_index ON pre_assign(ip, uid);"
|
||||||
|
|
||||||
|
#define CREATE_IPTV_TABLE() \
|
||||||
|
"CREATE TABLE IF NOT EXISTS iptv" \
|
||||||
|
" ( id INTEGER PRIMARY KEY AUTOINCREMENT," \
|
||||||
|
" uid INTEGER NOT NULL," \
|
||||||
|
" mac CHAR(20) NOT NULL," \
|
||||||
|
" createTm TIMESTAMP DEFAULT (datetime('now', 'localtime')) NOT NULL" \
|
||||||
|
"); CREATE INDEX IF NOT EXISTS iptv_index ON iptv(uid);"
|
||||||
|
|
||||||
|
#define INSERT_IPTV_DEVICE \
|
||||||
|
"INSERT INTO iptv (uid, mac) SELECT %d, '%s' WHERE NOT EXISTS (SELECT id FROM iptv WHERE uid = %d AND mac = " \
|
||||||
|
"'%s');"
|
||||||
|
|
||||||
#define INSERT_PRE_ASSIGN_ROW_FMT \
|
#define INSERT_PRE_ASSIGN_ROW_FMT \
|
||||||
"INSERT INTO pre_assign (uid, xid, hostname, mac, ip, lease, netmask, gateway, dns1, dns2, server) " \
|
"INSERT INTO pre_assign (uid, xid, hostname, mac, ip, lease, netmask, gateway, dns1, dns2, server) " \
|
||||||
"VALUES (%d, %d, '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s');"
|
"VALUES (%d, %d, '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s');"
|
||||||
|
@ -114,6 +124,22 @@
|
||||||
|
|
||||||
#define LEASE_RELEASE_FMT "DELETE FROM lease WHERE uid = %d AND mac = '%s' AND ip = '%s'"
|
#define LEASE_RELEASE_FMT "DELETE FROM lease WHERE uid = %d AND mac = '%s' AND ip = '%s'"
|
||||||
|
|
||||||
|
int db_iptv_add_device(U32 uid, const char *pMac) {
|
||||||
|
int rc;
|
||||||
|
char buf[2048] = {0};
|
||||||
|
//INSERT INTO iptv (uid, mac) SELECT 0, '58:B4:2D:DA:D4:25' WHERE NOT EXISTS (SELECT id FROM iptv WHERE uid = 0 AND mac = '58:B4:2D:DA:D4:26')
|
||||||
|
|
||||||
|
snprintf(buf, 2048, INSERT_IPTV_DEVICE, uid, pMac, uid, pMac);
|
||||||
|
|
||||||
|
rc = db_sqlite3_sql_exec(buf, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (rc != ERR_SUCCESS) {
|
||||||
|
LOG_MOD(error, ZM_DHCP_DB, "DB add iptv device error: %s\n", buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ERR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int lease_add(PDHCP_REQ pReq,
|
static int lease_add(PDHCP_REQ pReq,
|
||||||
const char *ip,
|
const char *ip,
|
||||||
const char *netmask,
|
const char *netmask,
|
||||||
|
@ -506,5 +532,11 @@ int db_init_lease_database() {
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc = db_sqlite3_sql_exec(CREATE_IPTV_TABLE(), NULL, NULL, NULL);
|
||||||
|
|
||||||
|
if (rc != ERR_SUCCESS) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
return ERR_SUCCESS;
|
return ERR_SUCCESS;
|
||||||
}
|
}
|
|
@ -536,6 +536,8 @@ static void on_sock_recv(uv_work_t *req) {
|
||||||
PDHCP_PROTO pkg = get_dhcp_date(pWork->pPkgBase, &optSize, pWork->nSize);
|
PDHCP_PROTO pkg = get_dhcp_date(pWork->pPkgBase, &optSize, pWork->nSize);
|
||||||
struct iphdr *pIpHdr = (struct iphdr *)((U8 *)pkg - sizeof(struct iphdr) - sizeof(struct udphdr));
|
struct iphdr *pIpHdr = (struct iphdr *)((U8 *)pkg - sizeof(struct iphdr) - sizeof(struct udphdr));
|
||||||
|
|
||||||
|
//LOG_MSG(info, "Recv, xid: 0x%08X\n", DHCP_XID(pkg->xid));
|
||||||
|
|
||||||
//sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", macStr[0], macStr[1], macStr[2], macStr[3], macStr[4], macStr[5]);
|
//sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", macStr[0], macStr[1], macStr[2], macStr[3], macStr[4], macStr[5]);
|
||||||
|
|
||||||
// Check op flag
|
// Check op flag
|
||||||
|
@ -581,7 +583,12 @@ static void on_sock_recv(uv_work_t *req) {
|
||||||
|
|
||||||
ret = dhcp_get_option(OPT_VENDORCLASSID, pkg->options, optSize, &opt);
|
ret = dhcp_get_option(OPT_VENDORCLASSID, pkg->options, optSize, &opt);
|
||||||
if (ret == ERR_SUCCESS) {
|
if (ret == ERR_SUCCESS) {
|
||||||
strncpy(reqDhcp.vendorClassId, (char *)opt.pValue, MIN((int)opt.len, 256));
|
memcpy(reqDhcp.vendorClassId, (char *)opt.pValue, MIN((int)opt.len, 256));
|
||||||
|
|
||||||
|
// IPTV 组播设备不用分配IP地址
|
||||||
|
if (analyze_iptv_multicast_dev((const U8 *)reqDhcp.vendorClassId, opt.len, macStr, reqDhcp.uid)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = dhcp_get_option(OPT_HOSTNAME, pkg->options, optSize, &opt);
|
ret = dhcp_get_option(OPT_HOSTNAME, pkg->options, optSize, &opt);
|
||||||
|
@ -719,7 +726,6 @@ static void on_sock_recv(uv_work_t *req) {
|
||||||
//dhcp_option_prase(optMsg, pkg->options, pWork->nSize - sizeof(DHCP_PACKAGE));
|
//dhcp_option_prase(optMsg, pkg->options, pWork->nSize - sizeof(DHCP_PACKAGE));
|
||||||
|
|
||||||
//LOG_MSG_HEX(trace, pkg, pWork->nSize);
|
//LOG_MSG_HEX(trace, pkg, pWork->nSize);
|
||||||
//LOG_MSG(info, "Recv, xid: 0x%08X\n", DHCP_XID(pkg->xid));
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
LOG_MOD(info, ZM_DHCP_NET, "vlan = %u\n", VXLAN_VIN_ID_PACK(pkg->hdr.vlan.id));
|
LOG_MOD(info, ZM_DHCP_NET, "vlan = %u\n", VXLAN_VIN_ID_PACK(pkg->hdr.vlan.id));
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
#include "rfc2131.h"
|
||||||
|
#include "ip_pool.h"
|
||||||
int db_add_pre_assign(PDHCP_REQ pReq, U32 ip, PPOOL_CTX pPool);
|
int db_add_pre_assign(PDHCP_REQ pReq, U32 ip, PPOOL_CTX pPool);
|
||||||
int db_init_lease_database();
|
int db_init_lease_database();
|
||||||
int db_get_pre_assign(U32 uid, const char *mac, const char *hostname, U32 *preAssign);
|
int db_get_pre_assign(U32 uid, const char *mac, const char *hostname, U32 *preAssign);
|
||||||
|
@ -17,6 +19,7 @@ int db_clearup_timeout_lease();
|
||||||
int db_lock_pre_assign_ip();
|
int db_lock_pre_assign_ip();
|
||||||
int db_release_lease(PDHCP_REQ pReq);
|
int db_release_lease(PDHCP_REQ pReq);
|
||||||
int db_add_lease(PDHCP_REQ pReq, PPOOL_CTX pCtx);
|
int db_add_lease(PDHCP_REQ pReq, PPOOL_CTX pCtx);
|
||||||
|
int db_iptv_add_device(U32 uid, const char *pMac);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
|
|
||||||
#ifndef VCPE_DHCP_OPTIONS_H
|
#ifndef VCPE_DHCP_OPTIONS_H
|
||||||
#define VCPE_DHCP_OPTIONS_H
|
#define VCPE_DHCP_OPTIONS_H
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -148,8 +150,10 @@ int dhcp_add_buf_option(U8 *pBegin, int opt, U8 *buf, U8 nSize);
|
||||||
int dhcp_add_string_option(U8 *pBegin, int opt, const char *buf);
|
int dhcp_add_string_option(U8 *pBegin, int opt, const char *buf);
|
||||||
int dhcp_get_option(int opt, U8 *pOptData, U32 nSize, PDHCP_OPT pVal);
|
int dhcp_get_option(int opt, U8 *pOptData, U32 nSize, PDHCP_OPT pVal);
|
||||||
void dhcp_option_cfg_init();
|
void dhcp_option_cfg_init();
|
||||||
const char* dhcp_get_opName(int opt);
|
const char *dhcp_get_opName(int opt);
|
||||||
int dhcp_get_opType(int opt);
|
int dhcp_get_opType(int opt);
|
||||||
|
int analyze_iptv_multicast_dev(const unsigned char *p, int UNUSED_size, const char *mac, U32 uid);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
//
|
||||||
|
// Created by HuangXin on 2023/5/17.
|
||||||
|
//
|
||||||
|
#include <string.h>
|
||||||
|
#include "zlog_module.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "db_interface.h"
|
||||||
|
|
||||||
|
int analyze_iptv_multicast_dev(const unsigned char *p, int UNUSED(size), const char *mac, U32 uid) {
|
||||||
|
char ipTvId[16] = {0};
|
||||||
|
memcpy(ipTvId, &p[4], 10);
|
||||||
|
|
||||||
|
if (strcmp(ipTvId, "JSCMCC-OTT") == 0) {
|
||||||
|
LOG_MOD(debug, ZM_DHCP, "Found IPTV %s of user %d\n", mac, uid);
|
||||||
|
db_iptv_add_device(uid, mac);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_MOD(trace, ZM_DHCP, "Device %s is not IPTV device of user %d\n", mac, uid);
|
||||||
|
return FALSE;
|
||||||
|
}
|
Loading…
Reference in New Issue