⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dns_recu.c.svn-base

📁 域名解析器的实现
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
/* include files declaration */
#include <l3/inc/phase2.h>
#include <l3/ap/dnsr/h/dns.h>
#include <l3/ap/dnsr/h/dnsr_if.h>

/*-----------------------------------------------------------------------
 * Local Variables
 *-----------------------------------------------------------------------
 */  
/* Global variables */
static struct static_dns_tab   dns_host_tab[MAX_STATIC_DNS_NUM];   /* static "name <-> ip" mapping table */

struct dns_qrr {
  unsigned char *name;          /* RR name */
  UI16_T  class;               /* DNS class of RR */
  UI16_T  type;                /* DNS type of RR */
};

/*-----------------------------------------------------------------------
 * Functions
 *-----------------------------------------------------------------------
 */  
    
/* if two domain name match
   return 1;
   else
   return 0;             */
static UI8_T dns_name_match(UI8_T *name1, UI8_T *name2)
{
    int i;

    if (name1==NULL || name2==NULL)
        return 0;
    if (strlen((const char*)name1)!=strlen((const char*)name2))
        return 0;
    /* hawa:change to use strcmp to compare both strings */
    for (i=0;i<255;i++)
    {
        if (name1[i]==0x0)
            break;
        if (name1[i] == name2[i] )                
            continue;
        else
        {
            if (name1[i] > name2[i] )                
            {
                if ( (name1[i] >=0x61 && name1[i] <=0x7a )&& (name1[i]-0x20) == name2[i])
                    continue;
                else
                    return 0;                        
            }                        
            else
            {
                if ((name2[i] >=0x61 && name2[i] <=0x7a )&& (name2[i]-0x20) == name1[i])
                    continue;
                else
                    return 0;                                        
            }                        
        }                                
    }                        
    
    #if DNSR_DEBUG
        DBG_L3_Printf("find matched domain name in host table!\n");
    #endif
    
    return 1;
} /* dns_name_match */

static UI32_T dns_find_ip_at_table(unsigned char *name)
{
    int i;

    for (i = 0 ; i < MAX_STATIC_DNS_NUM ; i++)
    {
        if (dns_host_tab[i].stat)
	    {
		    /*if (dns_name_match(dns_full_name_tab[i], name) == 1)*/
		    if (dns_name_match(dns_host_tab[i].dns_name, name) == 1)
                return SWAP32(dns_host_tab[i].ip_addr);
	    }
    }

    #if DNSR_DEBUG
      DBG_L3_Printf("find no ip match %s\n", name);
    #endif

    return 0 ;
} /* dns_find_ip_at_table */


static UI32_T victor_read_addr(UI8_T *p)
{
    UI8_T digit[3];
    I16_T idx;     
    UI32_T addr=0;  
    UI32_T temp=0;

    I16_T i,j;
     
     
    for (i=0;i<4;i++)
    {                 
        idx=0;              
        while(*p!='.')
        {   
            if (idx>=3)
            return 0;            
            digit[idx]=*p;
            p++;
            idx++;     
        }
        p++;         

        for (j=0;j<idx;j++)
        {
            if (idx-j==3)            
                temp+=(digit[j]-48)*100;
            else if (idx-j==2)      
                temp+=(digit[j]-48)*10;
            else if (idx-j==1)      
                temp+=(digit[j]-48);            
        }
        
        for (j=0;j<i;j++)
            temp*=0x100;     
        addr+=temp;
        temp=0;
    } /* for loop */
    
#if DNSR_DEBUG
        DBG_L3_Printf("addr = %d.%d.%d.%d\n",
                   addr/0x1000000,
                   addr%0x1000000/0x10000,
                   addr%0x10000/0x100,
                   addr%0x100);
#endif                   
                   
    return addr; /* host ordering   */
};

static I8_T *dns_find_name_at_table(UI8_T *ipstring)
{
    UI32_T addr;
    int i;

    addr = victor_read_addr(ipstring);
    if (addr==0)
        return 0;

    for (i=0;i<MAX_STATIC_DNS_NUM;i++)
    {
        if (dns_host_tab[i].stat)
            if (SWAP32(dns_host_tab[i].ip_addr) == addr)
                return (I8_T*)&dns_host_tab[i].dns_name[0];/*dns_full_name_tab[i];*/
    }

    return 0;   
};
/*------------------------------------------------------------------------
 * BOOLEAN_T  dns_static_host_init()
 * Purpose: intialize Static DNS Table
 *
 *          
 * Parameters:
 *    Input:
 *    Output:
 * returns :
 *------------------------------------------------------------------------
 */                    
void dns_static_host_init(void)
{
    memset(&dns_host_tab[0], 0, sizeof(struct static_dns_tab)*MAX_STATIC_DNS_NUM);                   
}    
/*------------------------------------------------------------------------
 * BOOLEAN_T  dns_set_static_host()
 * Purpose: Set Static DNS Table
 *
 *          
 * Parameters:
 *    Input:
 *    Output:
 * returns :
 *------------------------------------------------------------------------
 */                    
BOOLEAN_T dns_set_static_host(UI32_T addr,UI8_T *name,UI32_T name_size,BOOLEAN_T status ,UI32_T index)
{
    if (index >=DNSR_MAX_STATIC_TAB)	
        return FALSE;
        
	dns_host_tab[index].ip_addr = addr;        
	memcpy(dns_host_tab[index].dns_name, name ,name_size);        
	dns_host_tab[index].stat = status; 
	
	return TRUE;
}    

/*------------------------------------------------------------------------
 * dns_cache_ip_lookup()
 * Purpose: look up cache by name
 *          Returns status code.
 * Parameters:
 *    Input:
 *    Output:
 * returns :
 *------------------------------------------------------------------------
 */                       
static UI32_T dns_cache_ip_lookup(unsigned char *namebuf,PENDING_DNSR_MSG_PTR pMsg)
{
    struct  dns_rr *msg_rrs[DNS_MAX_RRS_PER_MSG];
    int     i,n_rrs;        
    UI32_T  ip_addr=0;        
    
    /*
     * Look in the cache.  Stop looping if we get anything but
     * a name error.
     */                        
    if ((n_rrs=dns_lookup(namebuf, pMsg->qclass, pMsg->qtype, msg_rrs, DNS_MAX_RRS_PER_MSG))<=0)        
        return 0 ;
        
        
    /* translate msg_rrs to ip */
    /*
     * Find all the A RRs, eliminating duplicates.
     */
    for (i = 0; i < n_rrs; ++i) 
    {
        if (msg_rrs[i]->class != DNS_C_IN ||
            msg_rrs[i]->type != DNS_T_A ||
            msg_rrs[i]->rdcount != 4)
            continue;
            
        ip_addr = dns_decode_bits32(msg_rrs[i]->rdata);            
        break;
    } /* for loop */
    
    return ip_addr;        
} /* dns_find_ip_at_table */
/*------------------------------------------------------------------------
 * dns_cache_name_lookup()
 * Purpose: lookup cache by ip
 *          
 * Parameters:
 *    Input:
 *    Output:
 * returns :
 *------------------------------------------------------------------------
 */                       
static I8_T *dns_cache_name_lookup(unsigned char *namebuf,int *ret_namelen,PENDING_DNSR_MSG_PTR pMsg)
{
    struct  dns_rr *msg_rrs[DNS_MAX_RRS_PER_MSG];    
    int     i,n_rrs;            
    char    name[DNS_MAX_DOMAIN_NAME];
    
    memset(&name[0],0x0,sizeof(name));
	/*
     * Look in the cache.  Stop looping if we get anything but
     * a name error.
     */                            
    if ((n_rrs=dns_lookup(namebuf, pMsg->qclass, pMsg->qtype, msg_rrs, DNS_MAX_RRS_PER_MSG))<=0)        
        return 0 ;
        
    /* translate msg_rrs to domain name */        
    /*
     * Find all the A RRs, eliminating duplicates.
     */
    for (i = 0; i < n_rrs; ++i) 
    {
        if (msg_rrs[i]->class != DNS_C_IN ||
            msg_rrs[i]->type != DNS_T_PTR)
            continue;
            
        /* check the max length of DNS name */
        if (msg_rrs[i]->rdcount >DNS_MAX_RRS_PER_MSG)
            return 0;
        memcpy(name, msg_rrs[i]->rdata, msg_rrs[i]->rdcount);    
        *ret_namelen = msg_rrs[i]->rdcount;
        return (I8_T*)&name[0];                
    } /* for loop */
    
    return 0;            
}
/*------------------------------------------------------------------------
 * BOOLEAN_T  dns_response_tx()
 * Purpose: direct to response DNS request packet without sending packet 
 *          to server
 *          
 * Parameters:
 *    Input:
 *    Output:
 * returns :
 *------------------------------------------------------------------------
 */                    
BOOLEAN_T dns_response_tx(PENDING_DNSR_MSG_PTR pMsg,   
                     int len, unsigned long addrs[],                     
                     unsigned char *name,
                     unsigned long ttls[]                     
                     )
{
    unsigned char *p,*pkt=NULL;
    int i,pkt_len=0;
            
    
    /* addr or name answers */
    switch (pMsg->qtype)
    {
      case DNS_T_A:  
        if((pkt = OS_mem_alloc(pMsg->qsec_len+DNS_HDR_LENGTH+16*len)) == NULL)
        {
#if DNSR_DEBUG
            DBG_L3_Printf("dns_response_tx: allocate memory failed!!\n") ;
#endif             
            return FALSE;
        }                             
            
            
        pkt_len =  pMsg->qsec_len+DNS_HDR_LENGTH+16*len;   
        dns_encode_bits32((unsigned char *)pkt + DNS_HDR_FLAGS,
                            DNS_FLD(pMsg->query_id, DNS_HDR_ID) | DNS_HDR_RD 
                            | DNS_HDR_RESP | DNS_HDR_RA);
        dns_encode_bits16((unsigned char *)pkt + DNS_HDR_QDCOUNT, 1);
        dns_encode_bits16((unsigned char *)pkt + DNS_HDR_ANCOUNT, 1);
        dns_encode_bits16((unsigned char *)pkt + DNS_HDR_NSCOUNT, 0);
        dns_encode_bits16((unsigned char *)pkt + DNS_HDR_ARCOUNT, 0);
        memcpy(pkt+DNS_HDR_LENGTH, pMsg->qsec_ptr, pMsg->qsec_len);                         
        p = (unsigned char *)pkt+DNS_HDR_LENGTH+pMsg->qsec_len;

        for (i = 0 ; i < len ; i++)   /* n addresses for answers */
        {
            dns_encode_bits16(p,0xc00c);
            p += 2;
            dns_encode_bits16(p, pMsg->qtype);
            p += 2;
            dns_encode_bits16(p, pMsg->qclass);
            p += 2;
            dns_encode_bits32(p, ttls[i]);              
            p += 4;
            dns_encode_bits16(p, 4);
            p += 2;
            dns_encode_bits32(p, addrs[i]);
            p += 4;
        } /* for loop */
        break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -