Merge remote-tracking branch 'kiszka/queues/slirp' into staging
This commit is contained in:
commit
6546bc3713
|
@ -24,9 +24,9 @@
|
||||||
|
|
||||||
#include "slirp.h"
|
#include "slirp.h"
|
||||||
|
|
||||||
void arp_table_add(Slirp *slirp, int ip_addr, uint8_t ethaddr[ETH_ALEN])
|
void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t ethaddr[ETH_ALEN])
|
||||||
{
|
{
|
||||||
const in_addr_t broadcast_addr =
|
const uint32_t broadcast_addr =
|
||||||
~slirp->vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr;
|
~slirp->vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr;
|
||||||
ArpTable *arptbl = &slirp->arp_table;
|
ArpTable *arptbl = &slirp->arp_table;
|
||||||
int i;
|
int i;
|
||||||
|
@ -60,29 +60,29 @@ void arp_table_add(Slirp *slirp, int ip_addr, uint8_t ethaddr[ETH_ALEN])
|
||||||
arptbl->next_victim = (arptbl->next_victim + 1) % ARP_TABLE_SIZE;
|
arptbl->next_victim = (arptbl->next_victim + 1) % ARP_TABLE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool arp_table_search(Slirp *slirp, int in_ip_addr,
|
bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
|
||||||
uint8_t out_ethaddr[ETH_ALEN])
|
uint8_t out_ethaddr[ETH_ALEN])
|
||||||
{
|
{
|
||||||
const in_addr_t broadcast_addr =
|
const uint32_t broadcast_addr =
|
||||||
~slirp->vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr;
|
~slirp->vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr;
|
||||||
ArpTable *arptbl = &slirp->arp_table;
|
ArpTable *arptbl = &slirp->arp_table;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
DEBUG_CALL("arp_table_search");
|
DEBUG_CALL("arp_table_search");
|
||||||
DEBUG_ARG("ip = 0x%x", in_ip_addr);
|
DEBUG_ARG("ip = 0x%x", ip_addr);
|
||||||
|
|
||||||
/* Check 0.0.0.0/8 invalid source-only addresses */
|
/* Check 0.0.0.0/8 invalid source-only addresses */
|
||||||
assert((in_ip_addr & htonl(~(0xf << 28))) != 0);
|
assert((ip_addr & htonl(~(0xf << 28))) != 0);
|
||||||
|
|
||||||
/* If broadcast address */
|
/* If broadcast address */
|
||||||
if (in_ip_addr == 0xffffffff || in_ip_addr == broadcast_addr) {
|
if (ip_addr == 0xffffffff || ip_addr == broadcast_addr) {
|
||||||
/* return Ethernet broadcast address */
|
/* return Ethernet broadcast address */
|
||||||
memset(out_ethaddr, 0xff, ETH_ALEN);
|
memset(out_ethaddr, 0xff, ETH_ALEN);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < ARP_TABLE_SIZE; i++) {
|
for (i = 0; i < ARP_TABLE_SIZE; i++) {
|
||||||
if (arptbl->table[i].ar_sip == in_ip_addr) {
|
if (arptbl->table[i].ar_sip == ip_addr) {
|
||||||
memcpy(out_ethaddr, arptbl->table[i].ar_sha, ETH_ALEN);
|
memcpy(out_ethaddr, arptbl->table[i].ar_sha, ETH_ALEN);
|
||||||
DEBUG_ARGS((dfd, " found hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
|
DEBUG_ARGS((dfd, " found hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||||
out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
|
out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
|
||||||
|
|
|
@ -106,9 +106,6 @@ if_output(struct socket *so, struct mbuf *ifm)
|
||||||
ifs_init(ifm);
|
ifs_init(ifm);
|
||||||
insque(ifm, ifq);
|
insque(ifm, ifq);
|
||||||
|
|
||||||
/* Expiration date = Now + 1 second */
|
|
||||||
ifm->expiration_date = qemu_get_clock_ns(rt_clock) + 1000000000ULL;
|
|
||||||
|
|
||||||
diddit:
|
diddit:
|
||||||
slirp->if_queued++;
|
slirp->if_queued++;
|
||||||
|
|
||||||
|
@ -157,9 +154,8 @@ diddit:
|
||||||
void
|
void
|
||||||
if_start(Slirp *slirp)
|
if_start(Slirp *slirp)
|
||||||
{
|
{
|
||||||
|
uint64_t now = qemu_get_clock_ns(rt_clock);
|
||||||
int requeued = 0;
|
int requeued = 0;
|
||||||
uint64_t now;
|
|
||||||
|
|
||||||
struct mbuf *ifm, *ifqt;
|
struct mbuf *ifm, *ifqt;
|
||||||
|
|
||||||
DEBUG_CALL("if_start");
|
DEBUG_CALL("if_start");
|
||||||
|
@ -172,8 +168,6 @@ if_start(Slirp *slirp)
|
||||||
if (!slirp_can_output(slirp->opaque))
|
if (!slirp_can_output(slirp->opaque))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
now = qemu_get_clock_ns(rt_clock);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See which queue to get next packet from
|
* See which queue to get next packet from
|
||||||
* If there's something in the fastq, select it immediately
|
* If there's something in the fastq, select it immediately
|
||||||
|
|
|
@ -738,6 +738,9 @@ int if_encap(Slirp *slirp, struct mbuf *ifm)
|
||||||
slirp->client_ipaddr = iph->ip_dst;
|
slirp->client_ipaddr = iph->ip_dst;
|
||||||
slirp_output(slirp->opaque, arp_req, sizeof(arp_req));
|
slirp_output(slirp->opaque, arp_req, sizeof(arp_req));
|
||||||
ifm->arp_requested = true;
|
ifm->arp_requested = true;
|
||||||
|
|
||||||
|
/* Expire request and drop outgoing packet after 1 second */
|
||||||
|
ifm->expiration_date = qemu_get_clock_ns(rt_clock) + 1000000000ULL;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -208,9 +208,9 @@ typedef struct ArpTable {
|
||||||
int next_victim;
|
int next_victim;
|
||||||
} ArpTable;
|
} ArpTable;
|
||||||
|
|
||||||
void arp_table_add(Slirp *slirp, int ip_addr, uint8_t ethaddr[ETH_ALEN]);
|
void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t ethaddr[ETH_ALEN]);
|
||||||
|
|
||||||
bool arp_table_search(Slirp *slirp, int in_ip_addr,
|
bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
|
||||||
uint8_t out_ethaddr[ETH_ALEN]);
|
uint8_t out_ethaddr[ETH_ALEN]);
|
||||||
|
|
||||||
struct Slirp {
|
struct Slirp {
|
||||||
|
|
Reference in New Issue