summaryrefslogtreecommitdiff
path: root/components/net/uip/rt-thread/uip_etharp.c
blob: 61e30fc6d00896ba604a303a5760e46abb92c673 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "uip_pbuf.h"
#include "uip-conf.h"
#include "rtdef.h"
#include "uip.h"
#include "uip_arp.h"
#include "uip_netif.h"

extern u16_t uip_len, uip_slen;
void 
etharp_ip_input(struct netif *netif, struct pbuf *p)
{
    u8_t *ptr;
    int i;
    ptr = p->payload;
    uip_len = p->len;
    for (i=0;i<p->len;i++) uip_buf[i] = ptr[i];
    uip_arp_ipin();
    uip_input();
    return;
}
void 
etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
{    
    u8_t *ptr,*pdata;
    //struct pbuf *q;
    int i;
    ptr = p->payload;
    uip_len = p->len;
    for (i=0;i<p->len;i++) uip_buf[i] = ptr[i];
    uip_arp_arpin();  //update arp table  uip_arp_arpin
    if (uip_len) 
    {
       if (( pdata =(u8_t*)rt_malloc(1500*sizeof(u8_t))) ==RT_NULL)
       {
          pbuf_free(p);
          return;
       }
       for (i=0; i < (UIP_LLH_LEN + 40); ++i) 
       {
           pdata[i] =  uip_buf[i];
        }
        for (; i < uip_len; ++i) 
        {
            pdata[i] =  uip_appdata[i - UIP_LLH_LEN - 40 ];
        }
        //q = p;
        p ->payload = pdata;
        p->len = uip_len;
        netif->linkoutput(netif,p);
        rt_free(pdata);
        pbuf_free(p);
      //  pbuf_free(q);
        return ;
        
       // return 0;    //ERR_OK
    }
    pbuf_free(p);
}