static int insert_cus
(
struct dhcp_binding *res, /* pointer to lease descriptor */
ULONG lease, /* lease duration, in seconds */
int tagnum, /* tag value of option */
char *inserted, /* bitmap of inserted options */
char flag, /* if ACTIVE, marks non-default options */
DHCP_SERVER_POOL poolParam
)
{
char *option = NULL;
int reqoptlen = 0;
char *reqopt = NULL;
int i = 0;
UINT8 addOption[DHCPS_MAX_OPTION_LEN] = {0};
int ret = 0;
//DHCP_SERVER_POOL pool;
int j = 0;
struct in_addr acAddr;
UINT8 hasAcAdrr = 0;
//memset(&pool, 0, sizeof(pool));
memset(addOption, 0, sizeof(addOption));
//swDhcpsPoolGet(res->poolName, &pool);
//todo getbyname
/* insert the requested options */
/* 在报文的option字段中,找到_DHCP_REQ_LIST_TAG 的位置 */
option = (char *)pickup_opt(dhcpsMsgIn.dhcp, priv_rdhcplen, _DHCP_REQ_LIST_TAG);
if (option != NULL)
{
reqopt = OPTBODY (option);/* option的类型 */
reqoptlen = DHCPOPTLEN (option);
/*
* Handle requested parameters. The PASSIVE flag only inserts options
* explicity configured into the resource entry. (Rule 1 of RFC 1541).
* Because the implementation used "tblc=dflt" to force inclusion of
* any missing parameters defined in the Host Requirements Document,
* the PASSIVE flag will also include those settings if not already
* present. (Rule 2 of RFC 1541).
*/
for (i = 0; i < reqoptlen; i++) /* 一共需要reqoptlen个options */
{
/* inserted 是一个位图,如果提供了某个options,它就会在该options对应的位上写上'1',
表示系统存在该位 */
char tmpOpt = (*(reqopt + i));
switch(tmpOpt)
{
case _DHCP_CLASS_ID_TAG:
{
{
DEBUG_DHCPS("class id\r\n");
char classIdStr[DHCPS_MAX_CLASS_ID_STR_LEN+1] = {0};
int idlen = 0;
if (ERR_NO_ERROR == rtdDhcpsGetClassId(classIdStr))
{
DEBUG_DHCPS("class id %s\r\n", classIdStr);
idlen= strlen(classIdStr);
if( 0 < idlen&&!ISSET(inserted, _DHCP_CLASS_ID_TAG))
{
#if 0
dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_CLASS_ID_TAG;
dhcpsMsgOut.dhcp->options[priv_off_options++] = idlen;
memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], classIdStr, idlen);
priv_off_options += idlen;
#endif
addOption[0] = _DHCP_CLASS_ID_TAG;
addOption[1] = idlen;
memcpy(&addOption[2], classIdStr, idlen);
ret = insert_it((char *)addOption);
if (ret == 0)
{
SETBIT(inserted,_DHCP_CLASS_ID_TAG);
}
}
}
insert_custom(res, lease, tmpOpt, inserted, flag,poolParam);
}
break;
}
case _DHCP_WAPCAP_AC_TAG:
{
#if 0
/* 存在用户指定的option 138字段添加上去 */
{
DEBUG_DHCPS("wapcap ip\r\n");
struct in_addr acAddr;
if (ERR_NO_ERROR == swDhcpsGetCapwapAcIp(&acAddr))
{
acAddr.s_addr = htonl(acAddr.s_addr);
DEBUG_DHCPS("wapcap ip %x\r\n", acAddr.s_addr);
if( 0 != acAddr.s_addr )
{
dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_WAPCAP_AC_TAG;
dhcpsMsgOut.dhcp->options[priv_off_options++] = 4;
memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], (char*)&acAddr.s_addr, 4);
priv_off_options += 4;
}
}
}
break;
#endif
/* 存在用户指定的option 138字段添加上去 */
{
DEBUG_DHCPS("wapcap ip\r\n");
if (ERR_NO_ERROR == rtdDhcpsGetCapwapAcIp(&acAddr))
{
if( 0 != acAddr.s_addr )
{
hasAcAdrr = 1;
}
}
if (hasAcAdrr == 0&&poolParam.controllerIp.s_addr!=0)
{
acAddr.s_addr=poolParam.controllerIp.s_addr;
if( 0 != acAddr.s_addr )
{
hasAcAdrr = 1;
}
}
if (hasAcAdrr&&!ISSET(inserted, _DHCP_WAPCAP_AC_TAG))
{
acAddr.s_addr = htonl(acAddr.s_addr);
DEBUG_DHCPS("wapcap ip %x\r\n", acAddr.s_addr);
#if 0
dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_WAPCAP_AC_TAG;
dhcpsMsgOut.dhcp->options[priv_off_options++] = 4;
memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], (char*)&acAddr.s_addr, 4);
priv_off_options += 4;
#endif
addOption[0] = _DHCP_WAPCAP_AC_TAG;
addOption[1] = 4;
memcpy(&addOption[2], (char*)&acAddr.s_addr, 4);
ret = insert_it((char *)addOption);
if (ret == 0)
{
SETBIT(inserted, _DHCP_WAPCAP_AC_TAG);
}
}
insert_custom(res, lease, tmpOpt, inserted, flag,poolParam);
}
break;
}
case _DHCP_DNS_DOMAIN_TAG:
{
/* insert domain name */
{
char domainName[DHCPS_DOMAIN_NAME_LEN + 1];
UINT8 len = 0;
if(poolParam.domainName!=NULL)
{
len=strlen(poolParam.domainName);
if(len>0)
{
snprintf(domainName,DHCPS_DOMAIN_NAME_LEN + 1,"%s",poolParam.domainName);
domainName[len]='\0';
}
}
DEBUG_DHCPS("domain name");
if ( 0 < len && !ISSET(inserted, _DHCP_DNS_DOMAIN_TAG))
{
#if 0
dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_DNS_DOMAIN_TAG;
dhcpsMsgOut.dhcp->options[priv_off_options++] = len;
memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], domainName, len);
priv_off_options += len;
#endif
addOption[0] = _DHCP_DNS_DOMAIN_TAG;
addOption[1] = len;
memcpy(&addOption[2], domainName, len);
ret = insert_it((char *)addOption);
if (ret == 0)
{
SETBIT(inserted, _DHCP_DNS_DOMAIN_TAG);
}
}
insert_custom(res, lease, tmpOpt, inserted, flag,poolParam);
}
break;
}
case _DHCP_NBN_SERVER_TAG:
{
/* insert NetBIOS name server */
{
struct in_addr nbnServer[DHCPS_MAX_NBNSERVER_NUM];
UINT8 num = 0;
UINT8 cnt = 0;
DEBUG_DHCPS("netbios server");
DEBUG_DHCPS("res->ip_addr:%x", (UINT32)res->ip_addr.ip.s_addr);
for (cnt = 0; cnt< DHCPS_MAX_NBNSERVER_NUM; cnt++)
{
if (0 != poolParam.netBiosNameServer[cnt].s_addr)
{
nbnServer[(num)++].s_addr = poolParam.netBiosNameServer[cnt].s_addr;
}
}
if ( 0 < num&& !ISSET(inserted, _DHCP_NBN_SERVER_TAG) )
{
#if 0
dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_NBN_SERVER_TAG;
dhcpsMsgOut.dhcp->options[priv_off_options++] = 4 * num;
for (cnt = 0; cnt < num; cnt++)
{
DHCP_PKT_HTONL(nbnServer[cnt].s_addr);
memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], (char *)&nbnServer[cnt].s_addr, 4);
DHCP_PKT_NTOHL(nbnServer[cnt].s_addr);
DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options]);
DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options+1]);
DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options+2]);
DEBUG_DHCPS("netbios server:%x", dhcpsMsgOut.dhcp->options[priv_off_options+3]);
priv_off_options += 4;
}
#endif
addOption[0] = _DHCP_NBN_SERVER_TAG;
addOption[1] = 4 * num;
for (cnt = 0; cnt < num; cnt++)
{
DHCP_PKT_HTONL(nbnServer[cnt].s_addr);
memcpy(&addOption[2+4*cnt], (char *)&nbnServer[cnt].s_addr, 4);
}
ret = insert_it((char *)addOption);
if (ret == 0)
{
SETBIT(inserted, _DHCP_NBN_SERVER_TAG);
}
}
insert_custom(res, lease, tmpOpt, inserted, flag,poolParam);
}
break;
}
case _DHCP_NB_NODETYPE_TAG:
{
/* insert NetBIOS node type */
{
NETBIOS_NODE_TYPE netBiosNodeType;
DEBUG_DHCPS("NetBIOS node type");
netBiosNodeType=poolParam.netBiosNodeType;
if ( NBN_SERVER_NODE_TYPE_ERR != netBiosNodeType&& !ISSET(inserted, _DHCP_NB_NODETYPE_TAG))
{
#if 0
dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_NB_NODETYPE_TAG;
dhcpsMsgOut.dhcp->options[priv_off_options++] = 1;
dhcpsMsgOut.dhcp->options[priv_off_options++] = netBiosNodeType;
#endif
addOption[0] = _DHCP_NB_NODETYPE_TAG;
addOption[1] = 1;
addOption[2] = netBiosNodeType;
ret = insert_it((char *)addOption);
if (ret == 0)
{
SETBIT(inserted, _DHCP_NB_NODETYPE_TAG);
}
}
insert_custom(res, lease, tmpOpt, inserted, flag,poolParam);
}
break;
}
default:
{
if (tmpOpt != 0)
{
for (j=0; j<DHCPS_MAX_OPTION_NUM; j++)
{
if (tmpOpt == poolParam.option[j].code && !ISSET(inserted, tmpOpt))
{
if(_DHCP_SIP_TAG == tmpOpt)
{
addOption[0] = tmpOpt;
addOption[1] = poolParam.option[j].len + 1;
if(poolParam.option[j].type==OP_IP)
{
addOption[2] = 1;
struct in_addr tmpAddr;
tmpAddr.s_addr=poolParam.option[j].value.ip.s_addr;
DHCP_PKT_HTONL(tmpAddr.s_addr);
memcpy(&addOption[3], (char *)&tmpAddr.s_addr, 4);
}
else
{
addOption[2] = 0;
if (OP_HEX == poolParam.option[j].type)
{
memcpy(&addOption[3], &(poolParam.option[j].value.hex), poolParam.option[j].len);
}
else
{
memcpy(&addOption[3], &(poolParam.option[j].value.ascii), poolParam.option[j].len);
}
}
ret = insert_it((char *)addOption);
if (ret == 0)
{
SETBIT(inserted, tmpOpt);
}
}
else if (OP_HEX == poolParam.option[j].type)
{
memcpy(&addOption[2], &(poolParam.option[j].value.hex), poolParam.option[j].len);
}
else
{
addOption[0] = tmpOpt;
addOption[1] = poolParam.option[j].len;
if(poolParam.option[j].type==OP_IP)
{
struct in_addr tmpAddr;
tmpAddr.s_addr=poolParam.option[j].value.ip.s_addr;
DHCP_PKT_HTONL(tmpAddr.s_addr);
memcpy(&addOption[2], (char *)&tmpAddr.s_addr, 4);
}
else
{
memcpy(&addOption[2], &(poolParam.option[j].value), poolParam.option[j].len);
}
ret = insert_it((char *)addOption);
if (ret == 0)
{
SETBIT(inserted, tmpOpt);
}
}
}
}
}
break;
}
}
}
}
/* 在报文的option字段中,找到_DHCP_OPTION82_TAG的位置 */
option = (char *)pickup_opt(dhcpsMsgIn.dhcp, priv_rdhcplen, _DHCP_OPTION82_TAG);
if (option != NULL)
{
#if 0
dhcpsMsgOut.dhcp->options[priv_off_options++] = _DHCP_OPTION82_TAG;
dhcpsMsgOut.dhcp->options[priv_off_options++] = DHCPOPTLEN(option);
memcpy(&dhcpsMsgOut.dhcp->options[priv_off_options], option + 2, DHCPOPTLEN(option)); /* parasoft-suppress PB-34 "hurihui" */
priv_off_options += DHCPOPTLEN(option);
#endif
addOption[0] = _DHCP_OPTION82_TAG;
addOption[1] = DHCPOPTLEN(option);
memcpy(&addOption[2], option + 2, DHCPOPTLEN(option));
ret = insert_it((char *)addOption);
if (ret == 0)
{
SETBIT(inserted, _DHCP_OPTION82_TAG);
}
}
return (0);
}
将option 120即_DHCP_SIP_TAG中的ascii和hex按照标准格式填入
最新发布