boredos_mirror/src/net/nic/nic_netif.c
2026-03-16 00:30:47 +01:00

77 lines
1.7 KiB
C

#include "lwip/opt.h"
#include "lwip/def.h"
#include "lwip/mem.h"
#include "lwip/pbuf.h"
#include "lwip/stats.h"
#include "lwip/snmp.h"
#include "lwip/ethip6.h"
#include "lwip/etharp.h"
#include "netif/etharp.h"
#include "nic.h"
#include "network.h"
#include "kutils.h"
#define IFNAME0 'e'
#define IFNAME1 'n'
static err_t nic_low_level_output(struct netif *netif, struct pbuf *p) {
(void)netif;
if (p->next == NULL) {
if (nic_send_packet(p->payload, p->len) != 0) {
return ERR_IF;
}
} else {
u8_t buffer[2048];
u16_t copied = pbuf_copy_partial(p, buffer, 2048, 0);
if (nic_send_packet(buffer, copied) != 0) {
return ERR_IF;
}
}
LINK_STATS_INC(link.xmit);
return ERR_OK;
}
static void nic_low_level_input(struct netif *netif) {
u8_t buffer[2048];
int len;
while ((len = nic_receive_packet(buffer, sizeof(buffer))) > 0) {
struct pbuf *p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
if (p != NULL) {
pbuf_take(p, buffer, len);
if (netif->input(p, netif) != ERR_OK) {
pbuf_free(p);
} else {
LINK_STATS_INC(link.recv);
}
}
}
}
err_t nic_netif_init(struct netif *netif) {
netif->name[0] = IFNAME0;
netif->name[1] = IFNAME1;
netif->output = etharp_output;
netif->linkoutput = nic_low_level_output;
nic_driver_t* dev = nic_get_driver();
if (!dev) return ERR_IF;
netif->hwaddr_len = 6;
nic_get_mac_address(netif->hwaddr);
netif->mtu = 1500;
netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;
// Explicitly set link to up to trigger lwIP state changes
netif_set_link_up(netif);
return ERR_OK;
}
void nic_netif_poll(struct netif *netif) {
nic_low_level_input(netif);
}