예제 #1
0
int   my_findIP_QUERY( char *qbuf, dhcp_message *message ) {
	MYSQL_RES	*res;
	MYSQL_ROW	myrow;

	SQL_QUERY_RET0( qbuf );
	res = mysql_store_result( my_sock );
	if (res == NULL) return 0;

	myrow = mysql_fetch_row( res );
	if (myrow == NULL) { mysql_free_result(res); return 0; }

	strncpy( message->s_macaddr, (myrow)[0], 20 );
	cv_addrmac( message->macaddr, message->s_macaddr, 6 );
	cv_mac2num( &(message->b_macaddr), message->macaddr );
	if (message->b_macaddr == 0) { mysql_free_result(res); return 0; }

	message->subnum = strtoull( (myrow)[1], NULL, 10 );

	if (((myrow)[2][0] & 0x5F) == 'Y')
		message->cpe_type = CPE_DYNAMIC;

	if (message->b_modem_macaddr == 0) {
		strcpy( message->s_modem_macaddr, (myrow)[3] );
		cv_addrmac( message->modem_macaddr, message->s_modem_macaddr, 6 );
		cv_mac2num( &(message->b_modem_macaddr), message->modem_macaddr );
		if (message->b_modem_macaddr == 0)	// 123456789012
			strcpy( message->s_modem_macaddr, "000000000000" );
	}

	message->lease_time = strtoull( (myrow)[4], NULL, 10 );

	mysql_free_result(res);

	my_findCM_MAC_CACHE( message );
	return 1;
}
예제 #2
0
void DecodeOptions( dhcp_message *message ) {
	packet_opts	*po;
	struct in_addr	s_ip;
	u_int8_t	*ino, *maxo;
	u_int8_t	kT, kL, kRL;
	int		flag = 1;
	char		*p;

	po = &(message->in_opts);
	ino = message->in_pack.options;
	maxo = ino + MAX_OPTIONS_LENGTH;

	while( flag ) {
		if (ino >= maxo) { flag = 0; continue; }
		kT = *ino; ino++; // DHCP-Option
		kL = *ino; ino++; // DHCP-Option-Length
		kRL = kL;
		if (kRL > (maxo - ino)) { kRL = (maxo - ino); }
		//fprintf(stderr,"DEBUG: OPTION: %d LENGTH: %d\n", kT, kL);
		switch( kT ) {
		case 0x00:
			flag = 0;
			break;

		case 0x0c:	/*  host-name  */
			memcpy( po->host_name, ino, kRL ); ino += kL;
			po->host_name_len = kRL;
			for( p = po->host_name; *p; p++ ) {
				if ( (*p < 48 ) ||
				     (*p >= 58 && *p <= 64) ||
				     (*p >= 91 && *p <= 96) ||
				     (*p >= 123 ) ) {
					*p = '-';
				}
			}
			break;

		case 0x2b:	/*  vendor-specific-information  */ {
                        u_int8_t        mmT, mmL, mmRL, mmCK;
			
			po->vsi_len = kRL;
                        mmCK = kRL;
                        while (mmCK > 0) {
                        	mmT = *ino; ino++; mmCK--; //DHCP-SubOption
                        	mmL = *ino; ino++; mmCK--; //DHCP-SubOptionLength
                      		mmRL = mmL;

                        	if (mmRL > (maxo - ino)) { mmRL = (maxo - ino); }
		//		fprintf(stderr,"DEBUG: OPTION: %d SUBOPTION: %d LENGTH: %d\n", kT, mmT, mmL);
                                switch( mmT ) {
                                case 0x04:              // Serialnumber
					memcpy( po->vsi_serialno, ino, mmRL ); ino += mmL; mmCK -= mmL;
                                        //fprintf(stderr,"SERIAL: %d %d %d %s\n", mmT, mmL, mmRL, po->vsi_serialno);
                                        break;
                                case 0x05:              // HW-Version
					memcpy( po->vsi_hwver, ino, mmRL ); ino += mmL; mmCK -= mmL;
                                        //fprintf(stderr,"HW-Version: %d %d %d %s\n", mmT, mmL, mmRL, po->vsi_hwver);
                                        break;
                                case 0x06:              // SW-Version
					memcpy( po->vsi_swver, ino, mmRL ); ino += mmL; mmCK -= mmL;
                                        //fprintf(stderr,"SW-Version: %d %d %d %s\n", mmT, mmL, mmRL, po->vsi_swver);
                                        break;
                                case 0x07:              // Bootrom
					memcpy( po->vsi_bootrom, ino, mmRL ); ino += mmL; mmCK -= mmL;
                                        //fprintf(stderr,"BOOTROM: %d %d %d %s\n", mmT, mmL, mmRL, po->vsi_bootrom);
                                        break;
                                case 0x08:              // Organizationally Uniqe Identifier
					memcpy( po->vsi_oui, ino, mmRL ); ino += mmL; mmCK -= mmL;
                                        //fprintf(stderr,"OUI: %d %d %d %s\n", mmT, mmL, mmRL, po->vsi_oui);
                                        break; 
                                case 0x09:              // Modelnumber
					memcpy( po->vsi_model, ino, mmRL ); ino += mmL; mmCK -= mmL;
                                        //fprintf(stderr,"MODEL: %d %d %d %s\n", mmT, mmL, mmRL, po->vsi_model);
                                        break;
                                case 0x0a:              // Vendorname
					memcpy( po->vsi_vendor, ino, mmRL ); ino += mmL; mmCK -= mmL;
                                        //fprintf(stderr,"VENDOR: %d %d %d %s\n", mmT, mmL, mmRL, po->vsi_vendor);
                                        break;
	                         default:
       		                          ino += mmL;  mmCK -= mmL;
                                 	  break;
                                        }
				}
			}
			break;

		case 0x32:	/*  dhcp-requested-address  */
			memcpy( &(po->request_addr), ino, 4 ); ino += kL;
			s_ip.s_addr = po->request_addr;
			strcpy( po->s_request_addr, inet_ntoa( s_ip ) );
			break;

		case 0x35:	/*  dhcp-message-type  */
			po->message_type = *ino; ino++; break;

		case 0x36:	/*  dhcp-server-identifier  */
			memcpy( &(po->server_ident), ino, 4 ); ino += kL; break;
			break;

		case 0x37:	/*  dhcp-parameter-request-list  */
			memcpy( po->request_list, ino, kRL ); ino += kL;
			po->request_list_len = kRL;
			break;

		case 0x39:	/*  dhcp-max-message-size  */
			memcpy( po->request_list, ino, kRL ); ino += kL; break;

		case 0x3c:	/*  vendor-class-identifier  */
			memcpy( po->vendor_ident, ino, kRL ); ino += kL;
			po->vendor_ident_len = kRL;
			po->docsis_modem = 0;
			if ( memcmp(po->vendor_ident, "docsis", 6) == 0) {
				po->docsis_modem = 1;
				Parse_Modem_Caps( message );
			}
			if ( memcmp(po->vendor_ident, "pktc", 4) == 0) { /* MTA MB-DOPS */
				po->docsis_modem = 1;
				Parse_MTA_Caps( message );
			}
			break;

		case 0x3d:	/*  dhcp-client-identifier  */
			memcpy( po->client_ident, ino, kRL ); ino += kL;
			po->client_ident_len = kRL;
			break;

		case 0x51:	/*  fqdn  */
			memcpy( po->fqdn, ino, kRL ); ino += kL;
			po->fqdn_len = kRL;
			break;

		case 0x52:	/*  relay-agent-information  */
                        {
                                u_int8_t        mmT, mmL, mmRL, mmCK;

                                po->agent_mac_len = kRL;
                                mmCK = kRL;
                                while (mmCK > 0) {

                                        mmT = *ino; ino++; mmCK--;
                                        mmL = *ino; ino++; mmCK--;
                                        mmRL = mmL;
                                        if (mmRL > (maxo - ino)) { mmRL = (maxo - ino); }
				        //fprintf(stderr,"DEBUG: OPTION: %d SUBOPTION: %d LENGTH: %d\n", kT, mmT, mmL);
					switch( mmT ) {
					case 0x01:		// agent id from Cisco CMTS
                                                memcpy( po->agentid, ino, mmRL ); ino += mmL; mmCK -= mmL;
                                                po->agentid_len = mmRL;
                                                cv_macaddr( po->agentid, po->s_agentid, mmRL );
                                                //fprintf(stderr,"AGENTID: %d %d %d %s -- \n", mmT, mmL, mmRL, po->s_agentid );
						break;
                                        case 0x02:		// CM mac address
                                                memcpy( po->modem_mac, ino, mmRL ); ino += mmL; mmCK -= mmL;
                                                po->modem_mac_len = mmRL;
                                                cv_macaddr( po->modem_mac, po->s_modem_mac, mmRL );
                                                cv_mac2num( &(po->b_modem_mac), po->modem_mac );
                                                strcpy( message->s_modem_macaddr, po->s_modem_mac );
                                                message->b_modem_macaddr = po->b_modem_mac;
                                                memcpy( message->modem_macaddr, po->modem_mac, 6 );
                                                //fprintf(stderr,"AGENTMAC: %d %d %d %s\n", mmT, mmL, mmRL, po->s_modem_mac );
						break;
					case 0x2b:		// CM IP from Moto
						ino += mmL;  mmCK -= mmL;
						break;
                                        default:
						ino += mmL;  mmCK -= mmL;
						break;
					}
                                }
                        }
			break;

		case 0xff:
			flag = 0;
			break;
		default:
			ino += kL;
			break;
		}
	}
}