cleaned up. X86emu does not work with debug trace on currently.
This commit is contained in:
@@ -49,7 +49,7 @@ int am79c874_init(uint8_t fec_ch, uint8_t phy_addr, uint8_t speed, uint8_t duple
|
||||
if (duplex); /* to do */
|
||||
|
||||
/* Initialize the MII interface */
|
||||
fec_mii_init(fec_ch, SYSCLK);
|
||||
fec_mii_init(fec_ch, SYSCLK / 1000);
|
||||
dbg("%s: PHY reset\r\n", __FUNCTION__);
|
||||
|
||||
/* Reset the PHY */
|
||||
|
||||
@@ -6,9 +6,18 @@
|
||||
*/
|
||||
|
||||
#include "net.h"
|
||||
#include "net_timer.h"
|
||||
#include "bas_printf.h"
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#define DBG_ARP
|
||||
#ifdef DBG_ARP
|
||||
#define dbg(format, arg...) do { xprintf("DEBUG: " format, ##arg); } while (0)
|
||||
#else
|
||||
#define dbg(format, arg...) do { ; } while (0)
|
||||
#endif /* DBG_ARP */
|
||||
|
||||
#define TIMER_NETWORK 3
|
||||
|
||||
static uint8_t *arp_find_pair(ARP_INFO *arptab, uint16_t protocol, uint8_t *hwa, uint8_t *pa)
|
||||
@@ -219,12 +228,12 @@ void arp_request(NIF *nif, uint8_t *pa)
|
||||
int i, result;
|
||||
|
||||
|
||||
xprintf("%s\r\n", __FUNCTION__);
|
||||
dbg("%s\r\n", __FUNCTION__);
|
||||
|
||||
pNbuf = nbuf_alloc();
|
||||
if (pNbuf == NULL)
|
||||
{
|
||||
xprintf("ARP: arp_request couldn't allocate Tx buffer\n");
|
||||
dbg("%s: arp_request couldn't allocate Tx buffer\n", __FUNCTION__);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -254,6 +263,7 @@ void arp_request(NIF *nif, uint8_t *pa)
|
||||
pNbuf->length = ARP_HDR_LEN;
|
||||
|
||||
/* Send the ARP request */
|
||||
dbg("%s: sending ARP request\r\n", __FUNCTION__);
|
||||
result = nif->send(nif, nif->broadcast, nif->hwa, ETH_FRM_ARP, pNbuf);
|
||||
|
||||
if (result == 0)
|
||||
@@ -290,7 +300,7 @@ uint8_t *arp_resolve(NIF *nif, uint16_t protocol, uint8_t *pa)
|
||||
* Check to see if the necessary MAC-to-IP translation information
|
||||
* is in table already
|
||||
*/
|
||||
if (arp_resolve_pa (nif, protocol, pa, &hwa))
|
||||
if (arp_resolve_pa(nif, protocol, pa, &hwa))
|
||||
return hwa;
|
||||
|
||||
/*
|
||||
@@ -300,13 +310,20 @@ uint8_t *arp_resolve(NIF *nif, uint16_t protocol, uint8_t *pa)
|
||||
*/
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
arp_request (nif, pa);
|
||||
arp_request(nif, pa);
|
||||
|
||||
timer_set_secs(TIMER_NETWORK, ARP_TIMEOUT);
|
||||
while (timer_get_reference(TIMER_NETWORK))
|
||||
{
|
||||
if (arp_resolve_pa (nif, protocol, pa, &hwa))
|
||||
dbg("%s: try to resolve %d.%d.%d.%d\r\n", __FUNCTION__,
|
||||
pa[0], pa[1], pa[2], pa[3], pa[4]);
|
||||
if (arp_resolve_pa(nif, protocol, pa, &hwa))
|
||||
{
|
||||
dbg("%s: resolved to %02x:%02x:%02x:%02x:%02x:%02x.\r\n", __FUNCTION__,
|
||||
hwa[0], hwa[1], hwa[2], hwa[3], hwa[4], hwa[5], hwa[6]);
|
||||
|
||||
return hwa;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include "bas_printf.h"
|
||||
#include "util.h"
|
||||
#include "am79c874.h"
|
||||
#include "bcm5222.h"
|
||||
#include <stdbool.h>
|
||||
|
||||
#if defined(MACHINE_FIREBEE)
|
||||
@@ -268,30 +269,30 @@ void fec_log_dump(uint8_t ch)
|
||||
*/
|
||||
void fec_debug_dump(uint8_t ch)
|
||||
{
|
||||
dbg("\n------------- FEC%d -------------\n",ch);
|
||||
dbg("EIR %08x \n", MCF_FEC_EIR(ch));
|
||||
dbg("EIMR %08x \n", MCF_FEC_EIMR(ch));
|
||||
dbg("ECR %08x \n", MCF_FEC_ECR(ch));
|
||||
dbg("RCR %08x \n", MCF_FEC_RCR(ch));
|
||||
dbg("R_HASH %08x \n", MCF_FEC_RHR_HASH(ch));
|
||||
dbg("TCR %08x \n", MCF_FEC_TCR(ch));
|
||||
dbg("FECTFWR %08x \n", MCF_FEC_FECTFWR(ch));
|
||||
dbg("FECRFSR %08x \n", MCF_FEC_FECRFSR(ch));
|
||||
dbg("FECRFCR %08x \n", MCF_FEC_FECRFCR(ch));
|
||||
dbg("FECRLRFP %08x \n", MCF_FEC_FECRLRFP(ch));
|
||||
dbg("FECRLWFP %08x \n", MCF_FEC_FECRLWFP(ch));
|
||||
dbg("FECRFAR %08x \n", MCF_FEC_FECRFAR(ch));
|
||||
dbg("FECRFRP %08x \n", MCF_FEC_FECRFRP(ch));
|
||||
dbg("FECRFWP %08x \n", MCF_FEC_FECRFWP(ch));
|
||||
dbg("FECTFSR %08x \n", MCF_FEC_FECTFSR(ch));
|
||||
dbg("FECTFCR %08x \n", MCF_FEC_FECTFCR(ch));
|
||||
dbg("FECTLRFP %08x \n", MCF_FEC_FECTLRFP(ch));
|
||||
dbg("FECTLWFP %08x \n", MCF_FEC_FECTLWFP(ch));
|
||||
dbg("FECTFAR %08x \n", MCF_FEC_FECTFAR(ch));
|
||||
dbg("FECTFRP %08x \n", MCF_FEC_FECTFRP(ch));
|
||||
dbg("FECTFWP %08x \n", MCF_FEC_FECTFWP(ch));
|
||||
dbg("FRST %08x \n", MCF_FEC_FECFRST(ch));
|
||||
dbg("--------------------------------\n\n");
|
||||
dbg("\r\n------------- FEC%d -------------\r\n",ch);
|
||||
dbg("EIR %08x \r\n", MCF_FEC_EIR(ch));
|
||||
dbg("EIMR %08x \r\n", MCF_FEC_EIMR(ch));
|
||||
dbg("ECR %08x \r\n", MCF_FEC_ECR(ch));
|
||||
dbg("RCR %08x \r\n", MCF_FEC_RCR(ch));
|
||||
dbg("R_HASH %08x \r\n", MCF_FEC_RHR_HASH(ch));
|
||||
dbg("TCR %08x \r\n", MCF_FEC_TCR(ch));
|
||||
dbg("FECTFWR %08x \r\n", MCF_FEC_FECTFWR(ch));
|
||||
dbg("FECRFSR %08x \r\n", MCF_FEC_FECRFSR(ch));
|
||||
dbg("FECRFCR %08x \r\n", MCF_FEC_FECRFCR(ch));
|
||||
dbg("FECRLRFP %08x \r\n", MCF_FEC_FECRLRFP(ch));
|
||||
dbg("FECRLWFP %08x \r\n", MCF_FEC_FECRLWFP(ch));
|
||||
dbg("FECRFAR %08x \r\n", MCF_FEC_FECRFAR(ch));
|
||||
dbg("FECRFRP %08x \r\n", MCF_FEC_FECRFRP(ch));
|
||||
dbg("FECRFWP %08x \r\n", MCF_FEC_FECRFWP(ch));
|
||||
dbg("FECTFSR %08x \r\n", MCF_FEC_FECTFSR(ch));
|
||||
dbg("FECTFCR %08x \r\n", MCF_FEC_FECTFCR(ch));
|
||||
dbg("FECTLRFP %08x \r\n", MCF_FEC_FECTLRFP(ch));
|
||||
dbg("FECTLWFP %08x \r\n", MCF_FEC_FECTLWFP(ch));
|
||||
dbg("FECTFAR %08x \r\n", MCF_FEC_FECTFAR(ch));
|
||||
dbg("FECTFRP %08x \r\n", MCF_FEC_FECTFRP(ch));
|
||||
dbg("FECTFWP %08x \r\n", MCF_FEC_FECTFWP(ch));
|
||||
dbg("FRST %08x \r\n", MCF_FEC_FECFRST(ch));
|
||||
dbg("--------------------------------\r\n\r\n");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -398,11 +399,11 @@ void fec_reset(uint8_t ch)
|
||||
| MCF_FEC_FECRFSR_FAE
|
||||
| MCF_FEC_FECRFSR_IP);
|
||||
MCF_FEC_FECTFSR(ch) = (0
|
||||
| MCF_FEC_FECRFSR_OF
|
||||
| MCF_FEC_FECRFSR_UF
|
||||
| MCF_FEC_FECRFSR_RXW
|
||||
| MCF_FEC_FECRFSR_FAE
|
||||
| MCF_FEC_FECRFSR_IP);
|
||||
| MCF_FEC_FECTFSR_OF
|
||||
| MCF_FEC_FECTFSR_UF
|
||||
| MCF_FEC_FECTFSR_TXW
|
||||
| MCF_FEC_FECTFSR_FAE
|
||||
| MCF_FEC_FECTFSR_IP);
|
||||
|
||||
/* Reset the FIFOs */
|
||||
MCF_FEC_FECFRST(ch) |= MCF_FEC_FECFRST_SW_RST;
|
||||
@@ -1003,13 +1004,17 @@ void fec_tx_frame(uint8_t ch)
|
||||
* Free up the network buffer that was just transmitted
|
||||
*/
|
||||
nbuf_free(pNbuf);
|
||||
dbg("%s: free buffer %p from TX ring\r\n", __FUNCTION__, pNbuf);
|
||||
|
||||
/*
|
||||
* Re-initialize the Tx BD
|
||||
*/
|
||||
pTxBD->data = NULL;
|
||||
pTxBD->length = 0;
|
||||
|
||||
return;
|
||||
}
|
||||
dbg("%s: BD ring is empty\r\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
void fec0_tx_frame(void)
|
||||
@@ -1228,16 +1233,20 @@ static void fec_irq_handler(uint8_t ch)
|
||||
if (event & MCF_FEC_EIR_MII)
|
||||
{
|
||||
fec_log[ch].mii++;
|
||||
dbg("%s: MII\r\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
if (event & MCF_FEC_EIR_TXF)
|
||||
{
|
||||
fec_log[ch].txf++;
|
||||
dbg("%s: TXF\r\n", __FUNCTION__);
|
||||
fec_log_dump(0);
|
||||
}
|
||||
|
||||
if (event & MCF_FEC_EIR_GRA)
|
||||
{
|
||||
fec_log[ch].gra++;
|
||||
dbg("%s: GRA\r\n", __FUNCTION__);
|
||||
}
|
||||
|
||||
if (event & MCF_FEC_EIR_BABT)
|
||||
@@ -1315,7 +1324,7 @@ void fec_eth_setup(uint8_t ch, uint8_t trcvr, uint8_t speed, uint8_t duplex, con
|
||||
* Initialize the FEC
|
||||
*/
|
||||
fec_reset(ch);
|
||||
fec_init(ch,trcvr,mac);
|
||||
fec_init(ch, trcvr, mac);
|
||||
|
||||
if (trcvr == FEC_MODE_MII)
|
||||
{
|
||||
@@ -1324,8 +1333,10 @@ void fec_eth_setup(uint8_t ch, uint8_t trcvr, uint8_t speed, uint8_t duplex, con
|
||||
*/
|
||||
#if defined(MACHINE_FIREBEE)
|
||||
am79c874_init(0, 0, speed, duplex);
|
||||
#elif defined(MACHINE_M548X)
|
||||
bcm_5222_init(0, 0, speed, duplex);
|
||||
#else
|
||||
fec_mii_init(ch, SYSCLK);
|
||||
fec_mii_init(ch, SYSCLK / 1000);
|
||||
#endif /* MACHINE_FIREBEE */
|
||||
}
|
||||
|
||||
|
||||
@@ -280,6 +280,8 @@ void ip_handler(NIF *nif, NBUF *pNbuf)
|
||||
*/
|
||||
ip_frame_hdr *ipframe;
|
||||
|
||||
dbg("%s: packet received\r\n", __FUNCTION__);
|
||||
|
||||
ipframe = (ip_frame_hdr *) &pNbuf->data[pNbuf->offset];
|
||||
|
||||
/*
|
||||
@@ -300,7 +302,7 @@ void ip_handler(NIF *nif, NBUF *pNbuf)
|
||||
switch (IP_PROTOCOL(ipframe))
|
||||
{
|
||||
case IP_PROTO_ICMP:
|
||||
// FIXME: icmp_handler(nif,pNbuf);
|
||||
// FIXME: icmp_handler(nif, pNbuf);
|
||||
break;
|
||||
case IP_PROTO_UDP:
|
||||
udp_handler(nif,pNbuf);
|
||||
|
||||
@@ -165,6 +165,7 @@ NBUF *nbuf_remove(int q)
|
||||
void nbuf_add(int q, NBUF *nbuf)
|
||||
{
|
||||
int level = set_ipl(7);
|
||||
|
||||
queue_add(&nbuf_queue[q], (QNODE *) nbuf);
|
||||
set_ipl(level);
|
||||
}
|
||||
@@ -198,19 +199,20 @@ void nbuf_debug_dump(void)
|
||||
|
||||
for (i = 0; i < NBUF_MAXQ; ++i)
|
||||
{
|
||||
dbg("\n\nQueue #%d\n\n", i);
|
||||
dbg("\tBuffer Location\tOffset\tLength\n");
|
||||
dbg("--------------------------------------\n");
|
||||
dbg("\r\n\r\nQueue #%d\r\n\r\n", i);
|
||||
dbg("\tBuffer Location\tOffset\tLength\r\n");
|
||||
dbg("--------------------------------------\r\n");
|
||||
j = 0;
|
||||
nbuf = (NBUF *) queue_peek(&nbuf_queue[i]);
|
||||
while (nbuf != NULL)
|
||||
{
|
||||
dbg("%d\t 0x%08x\t0x%04x\t0x%04x\n",j++,nbuf->data,
|
||||
dbg("%d\t0x%08x\t0x%04x\t0x%04x\r\n", j++, nbuf->data,
|
||||
nbuf->offset,
|
||||
nbuf->length);
|
||||
nbuf = (NBUF *) nbuf->node.next;
|
||||
}
|
||||
}
|
||||
dbg("\r\n");
|
||||
|
||||
set_ipl(level);
|
||||
#endif /* DBG_NBUF */
|
||||
|
||||
@@ -8,9 +8,18 @@
|
||||
#include "net_timer.h"
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "bas_printf.h"
|
||||
#include "MCF5475.h"
|
||||
#include "interrupts.h"
|
||||
|
||||
#define DBG_TMR
|
||||
#ifdef DBG_TMR
|
||||
#define dbg(format, arg...) do { xprintf("DEBUG: " format, ##arg); } while (0)
|
||||
#else
|
||||
#define dbg(format, arg...) do { ; } while (0)
|
||||
#endif /* DBG_TMR */
|
||||
|
||||
|
||||
#if defined(MACHINE_FIREBEE)
|
||||
#include "firebee.h"
|
||||
#elif defined(MACHINE_M5484LITE)
|
||||
@@ -37,6 +46,8 @@ int timer_default_isr(void *not_used, NET_TIMER *t)
|
||||
*/
|
||||
MCF_GPT_GMS(t->ch) = 0;
|
||||
|
||||
dbg("%s: timer isr called for timer channel %d\r\n", __FUNCTION__);
|
||||
|
||||
/*
|
||||
* Clear the reference - the desired seconds have expired
|
||||
*/
|
||||
@@ -119,7 +130,12 @@ bool timer_init(uint8_t ch, uint8_t lvl, uint8_t pri)
|
||||
* initialization code.
|
||||
*/
|
||||
if (!((ch <= 3) && (lvl <= 7) && (lvl >= 1) && (pri <= 7)))
|
||||
{
|
||||
dbg("%s: illegal parameters (ch=%d, lvl=%d, pri=%d)\r\n", __FUNCTION__,
|
||||
ch, lvl, pri);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset the timer
|
||||
@@ -143,8 +159,10 @@ bool timer_init(uint8_t ch, uint8_t lvl, uint8_t pri)
|
||||
(void *) &net_timer[ch])
|
||||
)
|
||||
{
|
||||
dbg("%s: could not register timer interrupt handler\r\n", __FUNCTION__);
|
||||
return false;
|
||||
}
|
||||
dbg("%s: timer handler registered\r\n", __FUNCTION__);
|
||||
|
||||
/*
|
||||
* Calculate the require CNT value to get a 1 second timeout
|
||||
@@ -162,7 +180,7 @@ bool timer_init(uint8_t ch, uint8_t lvl, uint8_t pri)
|
||||
* CNT = SYSTEM_CLOCK * (1000000/0xFFFF)
|
||||
*/
|
||||
net_timer[ch].pre = 0xFFFF;
|
||||
net_timer[ch].cnt = (uint16_t) (SYSCLK * (1000000 / 0xFFFF));
|
||||
net_timer[ch].cnt = (uint16_t) ((SYSCLK / 1000) * (1000000 / 0xFFFF));
|
||||
|
||||
/*
|
||||
* Save off the appropriate mode select register value
|
||||
|
||||
@@ -1,117 +1,133 @@
|
||||
/*
|
||||
* File: nif.c
|
||||
* Purpose: Network InterFace routines
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*/
|
||||
#include "net.h"
|
||||
#include "bas_types.h"
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
int nif_protocol_exist(NIF *nif, uint16_t protocol)
|
||||
{
|
||||
/*
|
||||
* This function searches the list of supported protocols
|
||||
* on the particular NIF and if a protocol handler exists,
|
||||
* true is returned. This function is useful for network cards
|
||||
* that needn't read in the entire frame but can discard frames
|
||||
* arbitrarily.
|
||||
*/
|
||||
int index;
|
||||
|
||||
for (index = 0; index < nif->num_protocol; ++index)
|
||||
{
|
||||
if (nif->protocol[index].protocol == protocol)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void nif_protocol_handler(NIF *nif, uint16_t protocol, NBUF *pNbuf)
|
||||
{
|
||||
/*
|
||||
* This function searches the list of supported protocols
|
||||
* on the particular NIF and if a protocol handler exists,
|
||||
* the protocol handler is invoked. This routine called by
|
||||
* network device driver after receiving a frame.
|
||||
*/
|
||||
int index;
|
||||
|
||||
for (index = 0; index < nif->num_protocol; ++index)
|
||||
{
|
||||
if (nif->protocol[index].protocol == protocol)
|
||||
nif->protocol[index].handler(nif,pNbuf);
|
||||
}
|
||||
}
|
||||
|
||||
void *nif_get_protocol_info(NIF *nif, uint16_t protocol)
|
||||
{
|
||||
/*
|
||||
* This function searches the list of supported protocols
|
||||
* on the particular NIF and returns a pointer to the
|
||||
* config info for 'protocol', otherwise NULL is returned.
|
||||
*/
|
||||
int index;
|
||||
|
||||
for (index = 0; index < nif->num_protocol; ++index)
|
||||
{
|
||||
if (nif->protocol[index].protocol == protocol)
|
||||
return (void *)nif->protocol[index].info;
|
||||
}
|
||||
return (void *)0;
|
||||
}
|
||||
|
||||
int nif_bind_protocol(NIF *nif, uint16_t protocol, void (*handler)(NIF *,NBUF *),
|
||||
void *info)
|
||||
{
|
||||
/*
|
||||
* This function registers 'protocol' as a supported
|
||||
* protocol in 'nif'.
|
||||
*/
|
||||
if (nif->num_protocol < (MAX_SUP_PROTO - 1))
|
||||
{
|
||||
nif->protocol[nif->num_protocol].protocol = protocol;
|
||||
nif->protocol[nif->num_protocol].handler = (void(*)(NIF*,NBUF*))handler;
|
||||
nif->protocol[nif->num_protocol].info = info;
|
||||
++nif->num_protocol;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
NIF *nif_init (NIF *nif)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ETH_ADDR_LEN; ++i)
|
||||
{
|
||||
nif->hwa[i] = 0;
|
||||
nif->broadcast[i] = 0xFF;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_SUP_PROTO; ++i)
|
||||
{
|
||||
nif->protocol[i].protocol = 0;
|
||||
nif->protocol[i].handler = 0;
|
||||
nif->protocol[i].info = 0;
|
||||
}
|
||||
nif->num_protocol = 0;
|
||||
|
||||
nif->mtu = 0;
|
||||
nif->ch = 0;
|
||||
nif->send = 0;
|
||||
|
||||
nif->f_rx = 0;
|
||||
nif->f_tx = 0;
|
||||
nif->f_rx_err = 0;
|
||||
nif->f_tx_err = 0;
|
||||
nif->f_err = 0;
|
||||
|
||||
return nif;
|
||||
}
|
||||
/*
|
||||
* File: nif.c
|
||||
* Purpose: Network InterFace routines
|
||||
*
|
||||
* Notes:
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*/
|
||||
#include "net.h"
|
||||
#include "bas_types.h"
|
||||
#include "bas_printf.h"
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
#define DBG_NIF
|
||||
#ifdef DBG_NIF
|
||||
#define dbg(format, arg...) do { xprintf("DEBUG: " format, ##arg); } while (0)
|
||||
#else
|
||||
#define dbg(format, arg...) do { ; } while (0)
|
||||
#endif /* DBG_NIF */
|
||||
|
||||
int nif_protocol_exist(NIF *nif, uint16_t protocol)
|
||||
{
|
||||
/*
|
||||
* This function searches the list of supported protocols
|
||||
* on the particular NIF and if a protocol handler exists,
|
||||
* true is returned. This function is useful for network cards
|
||||
* that needn't read in the entire frame but can discard frames
|
||||
* arbitrarily.
|
||||
*/
|
||||
int index;
|
||||
|
||||
for (index = 0; index < nif->num_protocol; ++index)
|
||||
{
|
||||
if (nif->protocol[index].protocol == protocol)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void nif_protocol_handler(NIF *nif, uint16_t protocol, NBUF *pNbuf)
|
||||
{
|
||||
/*
|
||||
* This function searches the list of supported protocols
|
||||
* on the particular NIF and if a protocol handler exists,
|
||||
* the protocol handler is invoked. This routine called by
|
||||
* network device driver after receiving a frame.
|
||||
*/
|
||||
int index;
|
||||
|
||||
for (index = 0; index < nif->num_protocol; ++index)
|
||||
{
|
||||
if (nif->protocol[index].protocol == protocol)
|
||||
{
|
||||
dbg("%s: call protocol handler for protocol %d at %p\r\n", __FUNCTION__, protocol,
|
||||
nif->protocol[index].handler);
|
||||
nif->protocol[index].handler(nif,pNbuf);
|
||||
return;
|
||||
}
|
||||
}
|
||||
dbg("%s: no protocol handler found for protocol %d\r\n", __FUNCTION__, protocol);
|
||||
}
|
||||
|
||||
void *nif_get_protocol_info(NIF *nif, uint16_t protocol)
|
||||
{
|
||||
/*
|
||||
* This function searches the list of supported protocols
|
||||
* on the particular NIF and returns a pointer to the
|
||||
* config info for 'protocol', otherwise NULL is returned.
|
||||
*/
|
||||
int index;
|
||||
|
||||
for (index = 0; index < nif->num_protocol; ++index)
|
||||
{
|
||||
if (nif->protocol[index].protocol == protocol)
|
||||
return (void *)nif->protocol[index].info;
|
||||
}
|
||||
return (void *)0;
|
||||
}
|
||||
|
||||
int nif_bind_protocol(NIF *nif, uint16_t protocol, void (*handler)(NIF *,NBUF *),
|
||||
void *info)
|
||||
{
|
||||
/*
|
||||
* This function registers 'protocol' as a supported
|
||||
* protocol in 'nif'.
|
||||
*/
|
||||
if (nif->num_protocol < (MAX_SUP_PROTO - 1))
|
||||
{
|
||||
nif->protocol[nif->num_protocol].protocol = protocol;
|
||||
nif->protocol[nif->num_protocol].handler = (void(*)(NIF*,NBUF*))handler;
|
||||
nif->protocol[nif->num_protocol].info = info;
|
||||
++nif->num_protocol;
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
NIF *nif_init (NIF *nif)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ETH_ADDR_LEN; ++i)
|
||||
{
|
||||
nif->hwa[i] = 0;
|
||||
nif->broadcast[i] = 0xFF;
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_SUP_PROTO; ++i)
|
||||
{
|
||||
nif->protocol[i].protocol = 0;
|
||||
nif->protocol[i].handler = 0;
|
||||
nif->protocol[i].info = 0;
|
||||
}
|
||||
nif->num_protocol = 0;
|
||||
|
||||
nif->mtu = 0;
|
||||
nif->ch = 0;
|
||||
nif->send = 0;
|
||||
|
||||
nif->f_rx = 0;
|
||||
nif->f_tx = 0;
|
||||
nif->f_rx_err = 0;
|
||||
nif->f_tx_err = 0;
|
||||
nif->f_err = 0;
|
||||
|
||||
return nif;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
*
|
||||
*/
|
||||
#include "bas_types.h"
|
||||
#include "bas_printf.h"
|
||||
#include "net.h"
|
||||
#include <stddef.h>
|
||||
|
||||
@@ -106,6 +107,8 @@ uint16_t udp_obtain_free_port(void)
|
||||
|
||||
int udp_send(NIF *nif, uint8_t *dest, int sport, int dport, NBUF *pNbuf)
|
||||
{
|
||||
uint8_t *myip;
|
||||
|
||||
if (nif == NULL)
|
||||
{
|
||||
dbg("%s: nif is NULL\r\n", __FUNCTION__);
|
||||
@@ -135,8 +138,14 @@ int udp_send(NIF *nif, uint8_t *dest, int sport, int dport, NBUF *pNbuf)
|
||||
/* Add the length of the UDP packet to the total length of the packet */
|
||||
pNbuf->length += 8;
|
||||
|
||||
return (ip_send(nif, dest, ip_get_myip(nif_get_protocol_info(nif, ETH_FRM_IP)),
|
||||
IP_PROTO_UDP, pNbuf));
|
||||
myip = ip_get_myip(nif_get_protocol_info(nif, ETH_FRM_IP));
|
||||
|
||||
dbg("%s: sent UDP request to %d.%d.%d.%d from %d.%d.%d.%d\r\n", __FUNCTION__,
|
||||
dest[0], dest[1], dest[2], dest[3],
|
||||
myip[0], myip[1], myip[2], myip[3]);
|
||||
|
||||
return (ip_send(nif, dest, myip, IP_PROTO_UDP, pNbuf));
|
||||
|
||||
}
|
||||
|
||||
void udp_handler(NIF *nif, NBUF *pNbuf)
|
||||
@@ -149,6 +158,8 @@ void udp_handler(NIF *nif, NBUF *pNbuf)
|
||||
|
||||
udpframe = (udp_frame_hdr *) &pNbuf->data[pNbuf->offset];
|
||||
|
||||
dbg("%s: packet received\r\n", __FUNCTION__);
|
||||
|
||||
/*
|
||||
* Adjust the length and valid data offset of the packet we are
|
||||
* passing on
|
||||
@@ -164,7 +175,7 @@ void udp_handler(NIF *nif, NBUF *pNbuf)
|
||||
handler(nif, pNbuf);
|
||||
else
|
||||
{
|
||||
xprintf("Received UDP packet for non-supported port\n");
|
||||
dbg("%s: received UDP packet for non-supported port\n", __FUNCTION__);
|
||||
nbuf_free(pNbuf);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user