aboutsummaryrefslogtreecommitdiffstats
path: root/tools/vnet/vnetd/vcache.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/vnet/vnetd/vcache.c')
-rw-r--r--tools/vnet/vnetd/vcache.c107
1 files changed, 60 insertions, 47 deletions
diff --git a/tools/vnet/vnetd/vcache.c b/tools/vnet/vnetd/vcache.c
index 1ea81ba292..3822b50f1e 100644
--- a/tools/vnet/vnetd/vcache.c
+++ b/tools/vnet/vnetd/vcache.c
@@ -44,6 +44,8 @@
#undef DEBUG
#include "debug.h"
+#include "varp_util.c"
+
static VarpCache *vcache = NULL;
void IPMessageQueue_init(IPMessageQueue *queue, int maxlen){
@@ -97,16 +99,20 @@ void VarpCache_sweep(VarpCache *z, int all);
* @param vmac vmac (in network order)
* @return 0 on success, error code otherwise
*/
-int varp_send(Conn *conn, uint16_t opcode, uint32_t vnet, Vmac *vmac, uint32_t addr){
+int varp_send(Conn *conn, uint16_t opcode, VnetId *vnet, Vmac *vmac, VarpAddr *addr){
int err = 0;
int varp_n = sizeof(VarpHdr);
VarpHdr varph = {};
+#ifdef DEBUG
+ char vnetbuf[VNET_ID_BUF];
+ char addrbuf[VARP_ADDR_BUF];
+#endif
- varph.vnetmsghdr.id = htons(VARP_ID);
- varph.vnetmsghdr.opcode = htons(opcode);
- varph.vnet = vnet;
- varph.vmac = *vmac;
- varph.addr = addr;
+ varph.hdr.id = htons(VARP_ID);
+ varph.hdr.opcode = htons(opcode);
+ varph.vnet = *vnet;
+ varph.vmac = *vmac;
+ varph.addr = *addr;
if(0){
struct sockaddr_in self;
@@ -117,8 +123,10 @@ int varp_send(Conn *conn, uint16_t opcode, uint32_t vnet, Vmac *vmac, uint32_t a
}
dprintf("> addr=%s opcode=%d\n",
inet_ntoa(conn->addr.sin_addr), opcode);
- dprintf("> vnet=%d vmac=" MACFMT " addr=" IPFMT "\n",
- ntohl(vnet), MAC6TUPLE(vmac->mac), NIPQUAD(addr));
+ dprintf("> vnet=%s vmac=" MACFMT " addr=%s\n",
+ VnetId_ntoa(vnet, vnetbuf),
+ MAC6TUPLE(vmac->mac),
+ VarpAddr_ntoa(addr, addrbuf));
err = marshal_bytes(conn->out, &varph, varp_n);
marshal_flush(conn->out);
dprintf("< err=%d\n", err);
@@ -157,21 +165,24 @@ int VCEntry_set_flags(VCEntry *z, int flags, int set){
*/
void VCEntry_print(VCEntry *ventry){
if(ventry){
- char *c, *d;
+ char *state, *flags;
+ char vnetbuf[VNET_ID_BUF];
+ char addrbuf[VARP_ADDR_BUF];
+
switch(ventry->state){
- case VCACHE_STATE_INCOMPLETE: c = "INC"; break;
- case VCACHE_STATE_REACHABLE: c = "RCH"; break;
- case VCACHE_STATE_FAILED: c = "FLD"; break;
- default: c = "UNK"; break;
+ case VCACHE_STATE_INCOMPLETE: state = "INC"; break;
+ case VCACHE_STATE_REACHABLE: state = "RCH"; break;
+ case VCACHE_STATE_FAILED: state = "FLD"; break;
+ default: state = "UNK"; break;
}
- d = (VCEntry_get_flags(ventry, VCACHE_FLAG_PROBING) ? "P" : " ");
+ flags = (VCEntry_get_flags(ventry, VCACHE_FLAG_PROBING) ? "P" : " ");
- printf("VENTRY(%p %s %s vnet=%d vmac=" MACFMT " addr=" IPFMT " time=%g)\n",
+ printf("VENTRY(%p %s %s vnet=%s vmac=" MACFMT " addr=%s time=%g)\n",
ventry,
- c, d,
- ntohl(ventry->key.vnet),
+ state, flags,
+ VnetId_ntoa(&ventry->key.vnet, vnetbuf),
MAC6TUPLE(ventry->key.vmac.mac),
- NIPQUAD(ventry->addr),
+ VarpAddr_ntoa(&ventry->addr, addrbuf),
ventry->timestamp);
} else {
printf("VENTRY: Null!\n");
@@ -239,11 +250,11 @@ int VCEntry_schedule(VCEntry *ventry){
* @param vmac virtual MAC address (copied)
* @return ventry or null
*/
-VCEntry * VCEntry_new(uint32_t vnet, Vmac *vmac){
+VCEntry * VCEntry_new(VnetId *vnet, Vmac *vmac){
VCEntry *z = ALLOCATE(VCEntry);
z->state = VCACHE_STATE_INCOMPLETE;
z->timestamp = time_now();
- z->key.vnet = vnet;
+ z->key.vnet = *vnet;
z->key.vmac = *vmac;
return z;
}
@@ -256,15 +267,9 @@ VCEntry * VCEntry_new(uint32_t vnet, Vmac *vmac){
*/
Hashcode vcache_key_hash_fn(void *k){
VCKey *key = k;
- Hashcode h;
- h = hash_2ul(key->vnet,
- (key->vmac.mac[0] << 24) |
- (key->vmac.mac[1] << 16) |
- (key->vmac.mac[2] << 8) |
- (key->vmac.mac[3] ));
- h = hash_hul(h,
- (key->vmac.mac[4] << 8) |
- (key->vmac.mac[5] ));
+ Hashcode h = 0;
+ h = VnetId_hash(h, &key->vnet);
+ h = Vmac_hash(h, &key->vmac);
return h;
}
@@ -278,8 +283,8 @@ Hashcode vcache_key_hash_fn(void *k){
int vcache_key_equal_fn(void *k1, void *k2){
VCKey *key1 = k1;
VCKey *key2 = k2;
- return (key1->vnet == key2->vnet)
- && (memcmp(key1->vmac.mac, key2->vmac.mac, ETH_ALEN) == 0);
+ return (VnetId_eq(&key1->vnet , &key2->vnet) &&
+ Vmac_eq(&key1->vmac, &key2->vmac));
}
void VarpCache_schedule(VarpCache *z);
@@ -351,7 +356,7 @@ VarpCache * VarpCache_new(void){
* @param vmac virtual MAC address (copied)
* @return new entry or null
*/
-VCEntry * VarpCache_add(VarpCache *z, uint32_t vnet, Vmac *vmac){
+VCEntry * VarpCache_add(VarpCache *z, VnetId *vnet, Vmac *vmac){
VCEntry *ventry;
HTEntry *entry;
@@ -378,8 +383,8 @@ int VarpCache_remove(VarpCache *z, VCEntry *ventry){
* @param vmac virtual MAC addres
* @return entry found or null
*/
-VCEntry * VarpCache_lookup(VarpCache *z, uint32_t vnet, Vmac *vmac){
- VCKey key = { .vnet = vnet, .vmac = *vmac };
+VCEntry * VarpCache_lookup(VarpCache *z, VnetId *vnet, Vmac *vmac){
+ VCKey key = { .vnet = *vnet, .vmac = *vmac };
VCEntry *ventry;
ventry = HashTable_get(z->table, &key);
return ventry;
@@ -389,13 +394,15 @@ void VCEntry_solicit(VCEntry *ventry){
dprintf(">\n");
if(VCEntry_get_flags(ventry, VCACHE_FLAG_LOCAL_PROBE)){
dprintf("> local probe\n");
- varp_send(vnetd->bcast_conn, VARP_OP_REQUEST, ventry->key.vnet, &ventry->key.vmac, ventry->addr);
+ varp_send(vnetd->bcast_conn, VARP_OP_REQUEST,
+ &ventry->key.vnet, &ventry->key.vmac, &ventry->addr);
}
if(VCEntry_get_flags(ventry, VCACHE_FLAG_REMOTE_PROBE)){
ConnList *l;
dprintf("> remote probe\n");
for(l = vnetd->connections; l; l = l->next){
- varp_send(l->conn, VARP_OP_REQUEST, ventry->key.vnet, &ventry->key.vmac, ventry->addr);
+ varp_send(l->conn, VARP_OP_REQUEST,
+ &ventry->key.vnet, &ventry->key.vmac, &ventry->addr);
}
}
@@ -440,7 +447,8 @@ int VCEntry_update(VCEntry *ventry, IPMessage *msg, VarpHdr *varph, int state){
IPMessage *msg;
while((msg = IPMessageQueue_pop(&ventry->queue))){
dprintf("> announce\n");
- varp_send(msg->conn, VARP_OP_ANNOUNCE, ventry->key.vnet, &ventry->key.vmac, ventry->addr);
+ varp_send(msg->conn, VARP_OP_ANNOUNCE,
+ &ventry->key.vnet, &ventry->key.vmac, &ventry->addr);
}
}
exit:
@@ -459,7 +467,7 @@ int VarpCache_update(VarpCache *z, IPMessage *msg, VarpHdr *varph, int state){
VCEntry *ventry;
dprintf(">\n");
- ventry = VarpCache_lookup(z, varph->vnet, &varph->vmac);
+ ventry = VarpCache_lookup(z, &varph->vnet, &varph->vmac);
if(ventry){
err = VCEntry_update(ventry, msg, varph, state);
} else {
@@ -503,14 +511,14 @@ void VarpCache_sweep(VarpCache *z, int all){
* @param local whether it's local or not
*/
void vcache_forward_varp(VarpHdr *varph, int local){
- uint16_t opcode = ntohs(varph->vnetmsghdr.opcode);
+ uint16_t opcode = ntohs(varph->hdr.opcode);
if(local){
ConnList *l;
for(l = vnetd->connections; l; l = l->next){
- varp_send(l->conn, opcode, varph->vnet, &varph->vmac, varph->addr);
+ varp_send(l->conn, opcode, &varph->vnet, &varph->vmac, &varph->addr);
}
} else {
- varp_send(vnetd->bcast_conn, opcode, varph->vnet, &varph->vmac, varph->addr);
+ varp_send(vnetd->bcast_conn, opcode, &varph->vnet, &varph->vmac, &varph->addr);
}
}
@@ -531,13 +539,13 @@ int vcache_handle_request(IPMessage *msg, VarpHdr *varph, int local){
#else
int vcache_handle_request(IPMessage *msg, VarpHdr *varph, int local){
int err = -ENOENT;
- uint32_t vnet;
+ VnetId *vnet;
Vmac *vmac;
VCEntry *ventry = NULL;
int reply = 0;
dprintf(">\n");
- vnet = htonl(varph->vnet);
+ vnet = &varph->vnet;
vmac = &varph->vmac;
ventry = VarpCache_lookup(vcache, vnet, vmac);
if(!ventry){
@@ -605,13 +613,18 @@ int vcache_handle_message(IPMessage *msg, int local){
VarpHdr *varph = &vmsg->varp.varph;
dprintf(">\n");
- if(1){
+#ifdef DEBUG
+ {
+ char vnetbuf[VNET_ID_BUF];
dprintf("> src=%s:%d\n", inet_ntoa(msg->saddr.sin_addr), ntohs(msg->saddr.sin_port));
dprintf("> dst=%s:%d\n", inet_ntoa(msg->daddr.sin_addr), ntohs(msg->daddr.sin_port));
- dprintf("> opcode=%d vnet=%u vmac=" MACFMT "\n",
- ntohs(varph->opcode), ntohl(varph->vnet), MAC6TUPLE(varph->vmac.mac));
+ dprintf("> opcode=%d vnet=%s vmac=" MACFMT "\n",
+ ntohs(varph->opcode),
+ VnetId_ntoa(&varph->vnet, vnetbuf),
+ MAC6TUPLE(varph->vmac.mac));
}
- switch(ntohs(varph->vnetmsghdr.opcode)){
+#endif
+ switch(ntohs(varph->hdr.opcode)){
case VARP_OP_REQUEST:
err = vcache_handle_request(msg, varph, local);
break;