Add HTTP port number to rhizome advertise packet

This commit is contained in:
Andrew Bettison 2012-06-25 18:03:00 +09:30
parent 4764cf2ace
commit 3d0038754b
4 changed files with 36 additions and 20 deletions

View File

@ -160,9 +160,7 @@ int ob_bcopy(overlay_buffer *b,int from, int to, int len)
int ob_append_byte(overlay_buffer *b,unsigned char byte)
{
if (ob_makespace(b,1)) return WHY("ob_makespace() failed");
bcopy(&byte,&b->bytes[b->length],1);
b->length++;
b->bytes[b->length++] = byte;
return 0;
}

View File

@ -616,7 +616,7 @@ int rhizome_queue_manifest_import(rhizome_manifest *m, struct sockaddr_in *peeri
fcntl(sock,F_SETFL, O_NONBLOCK);
struct sockaddr_in peeraddr;
bcopy(peerip,&peeraddr,sizeof(peeraddr));
peeraddr.sin_port=htons(RHIZOME_HTTP_PORT);
//peeraddr.sin_port=htons(RHIZOME_HTTP_PORT);
int r=connect(sock,(struct sockaddr*)&peeraddr,sizeof(peeraddr));
if ((errno!=EINPROGRESS)&&(r!=0)) {
WHY_perror("connect");

View File

@ -74,6 +74,7 @@ int bundle_offset[2]={0,0};
int overlay_rhizome_add_advertisements(int interface_number,overlay_buffer *e)
{
int voice_mode=0;
unsigned short int http_port = RHIZOME_HTTP_PORT;
/* behave differently during voice mode.
Basically don't encourage people to grab stuff from us, but keep
@ -105,7 +106,9 @@ int overlay_rhizome_add_advertisements(int interface_number,overlay_buffer *e)
if (ob_append_byte(e,OF_TYPE_RHIZOME_ADVERT))
return WHY("could not add rhizome bundle advertisement header");
ob_append_byte(e,1); /* TTL */
ob_append_byte(e,2); /* type */
ob_append_short(e, http_port); /* our HTTP server port */
int rfs_offset=e->length; /* remember where the RFS byte gets stored
so that we can patch it later */
ob_append_byte(e,1+8+1+1+1+RHIZOME_BAR_BYTES*slots_used/* RFS */);
@ -324,11 +327,18 @@ int overlay_rhizome_saw_advertisements(int i,overlay_frame *f, long long now)
if (!f) return -1;
int ofs=0;
int ad_frame_type=f->payload->bytes[ofs++];
struct sockaddr_in httpaddr = *(struct sockaddr_in *)f->recvaddr;
httpaddr.sin_port = RHIZOME_HTTP_PORT;
int manifest_length;
rhizome_manifest *m=NULL;
if (ad_frame_type==1)
{
switch (ad_frame_type) {
case 2:
/* The same as type=1, but includes the source HTTP port number */
httpaddr.sin_port = (f->payload->bytes[ofs] << 8) + f->payload->bytes[ofs + 1];
ofs += 2;
// FALL THROUGH ...
case 1:
/* Extract whole manifests */
while(ofs<f->payload->length) {
manifest_length=(f->payload->bytes[ofs]<<8)+f->payload->bytes[ofs+1];
@ -388,7 +398,7 @@ int overlay_rhizome_saw_advertisements(int i,overlay_frame *f, long long now)
return 0;
}
int importManifest=0;
if (rhizome_ignore_manifest_check(m,(struct sockaddr_in *)f->recvaddr))
if (rhizome_ignore_manifest_check(m, &httpaddr))
{
/* Ignoring manifest that has caused us problems recently */
if (1) WARNF("Ignoring manifest with errors: %s*", manifest_id_prefix);
@ -410,7 +420,7 @@ int overlay_rhizome_saw_advertisements(int i,overlay_frame *f, long long now)
if (debug&DEBUG_RHIZOME) DEBUG("Unverified manifest has errors - so not processing any further.");
/* Don't waste any time on this manifest in future attempts for at least
a minute. */
rhizome_queue_ignore_manifest(m,(struct sockaddr_in*)f->recvaddr,60000);
rhizome_queue_ignore_manifest(m, &httpaddr, 60000);
}
if (m) rhizome_manifest_free(m);
m=NULL;
@ -430,7 +440,7 @@ int overlay_rhizome_saw_advertisements(int i,overlay_frame *f, long long now)
m = NULL;
} else if (m->errors) {
if (debug&DEBUG_RHIZOME) DEBUGF("Verifying manifest %s* revealed errors -- not storing.", manifest_id_prefix);
rhizome_queue_ignore_manifest(m,(struct sockaddr_in*)f->recvaddr,60000);
rhizome_queue_ignore_manifest(m, &httpaddr, 60000);
rhizome_manifest_free(m);
m = NULL;
} else {
@ -438,7 +448,7 @@ int overlay_rhizome_saw_advertisements(int i,overlay_frame *f, long long now)
/* Add manifest to import queue. We need to know originating IPv4 address
so that we can transfer by HTTP. */
if (0) DEBUG("Suggesting fetching of a bundle");
rhizome_suggest_queue_manifest_import(m,(struct sockaddr_in *)f->recvaddr);
rhizome_suggest_queue_manifest_import(m, &httpaddr);
}
}
if (!manifest_length) {
@ -447,6 +457,7 @@ int overlay_rhizome_saw_advertisements(int i,overlay_frame *f, long long now)
}
ofs+=manifest_length;
}
break;
}
return 0;

View File

@ -287,16 +287,19 @@ int isOverlayPacket(FILE *f,unsigned char *packet,int *ofs,int len)
{
int i,j,k;
int rhizome_ad_frame_type=frame[0];
unsigned short int http_port = 0;
fprintf(f,"%sRhizome bundle advertisement frame, version %d\n",indent(8),rhizome_ad_frame_type);
if (rhizome_ad_frame_type>2)
fprintf(f,"%sWARNING: Version is newer than I understand.\n",indent(10));
i=1;
if (rhizome_ad_frame_type==1) {
/* Frame contains whole manifest(s) */
fprintf(f,"%sBundle Manifest(s) (i=%d, frame_len=%d):\n",
indent(8),i,frame_len);
while(i<frame_len)
{
switch (rhizome_ad_frame_type) {
case 2:
http_port = (frame[i] << 8) + frame[i+1];
i += 2;
fprintf(f,"%sHTTP port = %d\n", indent(8), http_port);
// FALL THROUGH ...
case 1:
/* Frame contains whole manifest(s) */
fprintf(f,"%sBundle Manifest(s) (i=%d, frame_len=%d):\n", indent(8),i,frame_len);
while(i<frame_len) {
int manifest_len=(frame[i]<<8)+frame[i+1];
/* Check for end of manifests */
if (manifest_len>=0xff00) { i+=1; break; }
@ -311,7 +314,7 @@ int isOverlayPacket(FILE *f,unsigned char *packet,int *ofs,int len)
for(;j<16;j++) fprintf(f," ");
fprintf(f," ");
for(j=0;j<16&&(i+j)<frame_len;j++) fprintf(f,"%c",frame[i+j]>=' '
&&frame[i+j]<0x7c?frame[i+j]:'.');
&&frame[i+j]<0x7c?frame[i+j]:'.');
fprintf(f,"\n");
}
i=frame_len;
@ -374,6 +377,10 @@ int isOverlayPacket(FILE *f,unsigned char *packet,int *ofs,int len)
}
i+=manifest_len;
}
break;
default:
fprintf(f,"%sWARNING: Version is newer than I understand.\n",indent(10));
break;
}
fprintf(f,"%sBundle Advertisement Records (BARs):\n",indent(8));