Skip to content

Commit

Permalink
v1.0.96.4; replaced gets with fgetc in core; minor name edit in arp; …
Browse files Browse the repository at this point in the history
…caught strange edge case in daemon & fixed (delt with irregular sized packets and recvmsg buffers); renamed: tcp_connection->tcp_conn, tcp_connection_stub->tcp_conn_stub, tcp_segment->tcp_seg; added per connection/stub stats tracking, no RTM access yet though
  • Loading branch information
jreed47 authored and Jonathan Reed committed Jul 2, 2013
1 parent c0fc03e commit 320f111
Show file tree
Hide file tree
Showing 10 changed files with 388 additions and 256 deletions.
6 changes: 3 additions & 3 deletions trunk/execs/core/core.c
Expand Up @@ -898,12 +898,12 @@ void core_termination_handler(int sig) {
}

void core_tests(void) {
char recv_data[4000];

while (1) {
PRINT_IMPORTANT("waiting...");
//sleep(10);
gets(recv_data);
//char recv_data[4000];
//gets(recv_data);
fgetc(stdin); //wait until user enters
PRINT_IMPORTANT("active");

if (0) {
Expand Down
2 changes: 1 addition & 1 deletion trunk/modules/arp/arp_internal.h
Expand Up @@ -120,7 +120,7 @@ int arp_cache_non_seeking_test(struct arp_cache *cache);
void arp_cache_shutdown(struct arp_cache *cache);
void arp_cache_free(struct arp_cache *cache);

void print_msgARP(struct arp_message *);
void print_msgARP(struct arp_message *msg);
void print_neighbors(struct linked_list *ptr_to_cache);
void print_IP_addrs(uint32_t addr_ip);
void print_MAC_addrs(uint64_t addr_mac);
Expand Down
39 changes: 24 additions & 15 deletions trunk/modules/daemon/icmpHandling.c
Expand Up @@ -11,10 +11,10 @@
struct daemon_socket_general_ops icmp_general_ops = { .proto = IPPROTO_ICMP, .socket_type_test = socket_icmp_test, .socket_out = socket_out_icmp,
.daemon_in_fdf = daemon_in_fdf_icmp, .daemon_in_error = daemon_in_error_icmp, };
static struct daemon_socket_out_ops icmp_out_ops = { .socket_out = socket_out_icmp, .bind_out = bind_out_icmp, .listen_out = listen_out_icmp, .connect_out =
connect_out_icmp, .accept_out = accept_out_icmp, .getname_out = getname_out_icmp, .ioctl_out = ioctl_out_icmp, .sendmsg_out = sendmsg_out_icmp,
connect_out_icmp, .accept_out = accept_out_icmp, .getname_out = getname_out_icmp, .ioctl_out = ioctl_out_icmp, .sendmsg_out = sendmsg_out_icmp,
.recvmsg_out = recvmsg_out_icmp, .getsockopt_out = getsockopt_out_icmp, .setsockopt_out = setsockopt_out_icmp, .release_out = release_out_icmp,
.poll_out = poll_out_icmp, .mmap_out = mmap_out_icmp, .socketpair_out = socketpair_out_icmp, .shutdown_out = shutdown_out_icmp, .close_out =
close_out_icmp, .sendpage_out = sendpage_out_icmp, };
close_out_icmp, .sendpage_out = sendpage_out_icmp, };
static struct daemon_socket_in_ops icmp_in_ops = { };
static struct daemon_socket_other_ops icmp_other_ops = { .recvmsg_timeout = recvmsg_timeout_icmp, };

Expand Down Expand Up @@ -527,7 +527,12 @@ void recvmsg_out_icmp(struct fins_module *module, struct wedge_to_daemon_hdr *hd
if (md->sockets[hdr->sock_index].sockopts.FIP_RECVERR) {
if (md->sockets[hdr->sock_index].error_buf > 0) {
store = (struct daemon_store *) list_remove_front(md->sockets[hdr->sock_index].error_list);
data_len = store->ff->ctrlFrame.data_len;
data = store->ff->ctrlFrame.data;
PRINT_DEBUG("removed store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);

md->sockets[hdr->sock_index].error_buf--;
PRINT_DEBUG("after: sock_index=%d, error_buf=%d", hdr->sock_index, md->sockets[hdr->sock_index].error_buf);

if (store->addr->ss_family == AF_INET) {
addr_len = (uint32_t) sizeof(struct sockaddr_in);
Expand All @@ -545,9 +550,6 @@ void recvmsg_out_icmp(struct fins_module *module, struct wedge_to_daemon_hdr *hd
nack_send(module, hdr->call_id, hdr->call_index, hdr->call_type, 1);
return;
}

data_len = store->ff->ctrlFrame.data_len;
data = store->ff->ctrlFrame.data;
} else {
//NACK
nack_send(module, hdr->call_id, hdr->call_index, hdr->call_type, 11); //Resource temporarily unavailable
Expand All @@ -563,7 +565,11 @@ void recvmsg_out_icmp(struct fins_module *module, struct wedge_to_daemon_hdr *hd
PRINT_DEBUG("before: sock_index=%d, data_buf=%d", hdr->sock_index, md->sockets[hdr->sock_index].data_buf);
if (md->sockets[hdr->sock_index].data_buf > 0) {
store = (struct daemon_store *) list_remove_front(md->sockets[hdr->sock_index].data_list);
md->sockets[hdr->sock_index].data_buf -= store->ff->dataFrame.pduLength - store->pos;
data_len = store->ff->dataFrame.pduLength;
data = store->ff->dataFrame.pdu;
PRINT_DEBUG("removed store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);

md->sockets[hdr->sock_index].data_buf -= data_len - store->pos;
PRINT_DEBUG("after: sock_index=%d, data_buf=%d", hdr->sock_index, md->sockets[hdr->sock_index].data_buf);

if (store->addr->ss_family == AF_INET) {
Expand All @@ -582,9 +588,6 @@ void recvmsg_out_icmp(struct fins_module *module, struct wedge_to_daemon_hdr *hd
nack_send(module, hdr->call_id, hdr->call_index, hdr->call_type, 1);
return;
}

data_len = store->ff->dataFrame.pduLength;
data = store->ff->dataFrame.pdu;
}
}

Expand Down Expand Up @@ -629,8 +632,10 @@ void recvmsg_out_icmp(struct fins_module *module, struct wedge_to_daemon_hdr *hd
if (flags & MSG_ERRQUEUE) {
daemon_store_free(store);
} else {
store->pos += msg_len;
PRINT_DEBUG("prepending store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);
list_prepend(md->sockets[hdr->sock_index].data_list, store);
md->sockets[hdr->sock_index].data_buf += store->ff->dataFrame.pduLength - store->pos;
md->sockets[hdr->sock_index].data_buf += data_len - store->pos;
}
}

Expand Down Expand Up @@ -1329,6 +1334,8 @@ void daemon_in_fdf_icmp(struct fins_module *module, struct finsFrame *ff, uint32

int i;
uint32_t flags;
uint32_t data_len;
uint8_t *data;
uint32_t data_pos;
struct daemon_call *call;
struct daemon_store *store;
Expand All @@ -1349,23 +1356,24 @@ void daemon_in_fdf_icmp(struct fins_module *module, struct finsFrame *ff, uint32
flags = POLLIN;
list_for_each2(md->sockets[i].call_list, poll_in_icmp, module, &flags);

data_len = ff->dataFrame.pduLength;
data = ff->dataFrame.pdu;
data_pos = 0;
while (1) {
flags = 0;
call = (struct daemon_call *) list_find1(md->sockets[i].call_list, daemon_call_recvmsg_test, &flags);
if (call != NULL) {
data_pos += recvmsg_in_icmp(call, module, ff->metaData, ff->dataFrame.pduLength - data_pos, ff->dataFrame.pdu + data_pos, src_addr,
0);
data_pos += recvmsg_in_icmp(call, module, ff->metaData, data_len - data_pos, data + data_pos, src_addr, 0);
list_remove(md->sockets[i].call_list, call);

if (data_pos == ff->dataFrame.pduLength) {
if (data_pos == data_len) {
break;
}
} else {
break;
}
}
if (data_pos == ff->dataFrame.pduLength) {
if (data_pos == data_len) {
continue;
}

Expand All @@ -1376,8 +1384,9 @@ void daemon_in_fdf_icmp(struct fins_module *module, struct finsFrame *ff, uint32
store->pos = data_pos;

if (list_has_space(md->sockets[i].data_list)) {
PRINT_DEBUG("appending store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);
list_append(md->sockets[i].data_list, store);
md->sockets[i].data_buf += store->ff->dataFrame.pduLength;
md->sockets[i].data_buf += data_len - store->pos;
PRINT_DEBUG("stored, sock_index=%d, ff=%p, meta=%p, data_buf=%d", i, store->ff, ff->metaData, md->sockets[i].data_buf);
} else {
PRINT_ERROR("data_list full: sock_index=%d, ff=%p", i, store->ff);
Expand Down
34 changes: 20 additions & 14 deletions trunk/modules/daemon/tcpHandling.c
Expand Up @@ -9,16 +9,16 @@
#include <finstypes.h>

struct daemon_socket_general_ops tcp_general_ops = { .proto = IPPROTO_TCP, .socket_type_test = socket_tcp_test, .socket_out = socket_out_tcp, .daemon_in_fdf =
daemon_in_fdf_tcp, .daemon_in_error = daemon_in_error_tcp, .daemon_in_poll = daemon_in_poll_tcp };
daemon_in_fdf_tcp, .daemon_in_error = daemon_in_error_tcp, .daemon_in_poll = daemon_in_poll_tcp };
static struct daemon_socket_out_ops tcp_out_ops = { .socket_out = socket_out_tcp, .bind_out = bind_out_tcp, .listen_out = listen_out_tcp, .connect_out =
connect_out_tcp, .accept_out = accept_out_tcp, .getname_out = getname_out_tcp, .ioctl_out = ioctl_out_tcp, .sendmsg_out = sendmsg_out_tcp,
connect_out_tcp, .accept_out = accept_out_tcp, .getname_out = getname_out_tcp, .ioctl_out = ioctl_out_tcp, .sendmsg_out = sendmsg_out_tcp,
.recvmsg_out = recvmsg_out_tcp, .getsockopt_out = getsockopt_out_tcp, .setsockopt_out = setsockopt_out_tcp, .release_out = release_out_tcp, .poll_out =
poll_out_tcp, .mmap_out = mmap_out_tcp, .socketpair_out = socketpair_out_tcp, .shutdown_out = shutdown_out_tcp, .close_out = close_out_tcp,
poll_out_tcp, .mmap_out = mmap_out_tcp, .socketpair_out = socketpair_out_tcp, .shutdown_out = shutdown_out_tcp, .close_out = close_out_tcp,
.sendpage_out = sendpage_out_tcp, };
static struct daemon_socket_in_ops tcp_in_ops = { .connect_in = connect_in_tcp, .accept_in = accept_in_tcp, .sendmsg_in = sendmsg_in_tcp, .getsockopt_in =
getsockopt_in_tcp, .setsockopt_in = setsockopt_in_tcp, .release_in = release_in_tcp, .poll_in = poll_in_tcp_fcf, };
getsockopt_in_tcp, .setsockopt_in = setsockopt_in_tcp, .release_in = release_in_tcp, .poll_in = poll_in_tcp_fcf, };
static struct daemon_socket_other_ops tcp_other_ops = { .connect_timeout = connect_timeout_tcp, .connect_expired = connect_expired_tcp, .accept_timeout =
accept_timeout_tcp, .accept_expired = accept_expired_tcp, .recvmsg_timeout = recvmsg_timeout_tcp, };
accept_timeout_tcp, .accept_expired = accept_expired_tcp, .recvmsg_timeout = recvmsg_timeout_tcp, };

int match_host_addr4_tcp(struct fins_module *module, uint32_t host_ip, uint16_t host_port) {
PRINT_DEBUG("Entered: module=%p, host=%u/%u", module, host_ip, host_port);
Expand Down Expand Up @@ -62,8 +62,8 @@ int match_conn_addr4_tcp(struct fins_module *module, uint32_t host_ip, uint16_t
test_rem_ip = addr4_get_ip(&md->sockets[i].rem_addr);
test_rem_port = addr4_get_port(&md->sockets[i].rem_addr);

if (test_host_port == host_port && test_rem_port == rem_port && (test_host_ip == INADDR_ANY || test_host_ip == host_ip) && (test_rem_ip
== INADDR_ANY || test_rem_ip == rem_ip)) {
if (test_host_port == host_port && test_rem_port == rem_port && (test_host_ip == INADDR_ANY || test_host_ip == host_ip)
&& (test_rem_ip == INADDR_ANY || test_rem_ip == rem_ip)) {
return i;
}
}
Expand Down Expand Up @@ -820,7 +820,11 @@ void recvmsg_out_tcp(struct fins_module *module, struct wedge_to_daemon_hdr *hdr
PRINT_DEBUG("before: sock_index=%d, data_buf=%d", hdr->sock_index, md->sockets[hdr->sock_index].data_buf);
if (md->sockets[hdr->sock_index].data_buf > 0) {
store = (struct daemon_store *) list_remove_front(md->sockets[hdr->sock_index].data_list);
md->sockets[hdr->sock_index].data_buf -= store->ff->dataFrame.pduLength - store->pos;
data_len = store->ff->dataFrame.pduLength;
data = store->ff->dataFrame.pdu;
PRINT_DEBUG("removed store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);

md->sockets[hdr->sock_index].data_buf -= data_len - store->pos;
PRINT_DEBUG("after: sock_index=%d, data_buf=%d", hdr->sock_index, md->sockets[hdr->sock_index].data_buf);

if (store->addr->ss_family == AF_INET) {
Expand Down Expand Up @@ -850,9 +854,6 @@ void recvmsg_out_tcp(struct fins_module *module, struct wedge_to_daemon_hdr *hdr
nack_send(module, hdr->call_id, hdr->call_index, hdr->call_type, 1);
return;
}

data_len = store->ff->dataFrame.pduLength;
data = store->ff->dataFrame.pdu;
}

if (store != NULL) {
Expand Down Expand Up @@ -896,8 +897,10 @@ void recvmsg_out_tcp(struct fins_module *module, struct wedge_to_daemon_hdr *hdr
if (flags & MSG_ERRQUEUE) {
daemon_store_free(store);
} else {
store->pos += msg_len;
PRINT_DEBUG("prepending store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);
list_prepend(md->sockets[hdr->sock_index].data_list, store);
md->sockets[hdr->sock_index].data_buf += store->ff->dataFrame.pduLength - store->pos;
md->sockets[hdr->sock_index].data_buf += data_len - store->pos;
}
}

Expand Down Expand Up @@ -2158,14 +2161,16 @@ void daemon_in_fdf_tcp(struct fins_module *module, struct finsFrame *ff, uint32_
uint32_t flags = POLLIN;
list_for_each2(md->sockets[sock_index].call_list, poll_in_tcp_fdf, module, &flags);

uint32_t data_len = ff->dataFrame.pduLength;
uint8_t *data = ff->dataFrame.pdu;
uint32_t data_pos = 0;
flags = 0;
struct daemon_call *call;

while (1) {
call = (struct daemon_call *) list_find1(md->sockets[sock_index].call_list, daemon_call_recvmsg_test, &flags);
if (call != NULL) {
data_pos += recvmsg_in_tcp_fdf(call, module, ff->metaData, ff->dataFrame.pduLength - data_pos, ff->dataFrame.pdu + data_pos, dst_addr, 0);
data_pos += recvmsg_in_tcp_fdf(call, module, ff->metaData, data_len - data_pos, data + data_pos, dst_addr, 0);
list_remove(md->sockets[sock_index].call_list, call);

if (data_pos == ff->dataFrame.pduLength) {
Expand All @@ -2184,8 +2189,9 @@ void daemon_in_fdf_tcp(struct fins_module *module, struct finsFrame *ff, uint32_
store->pos = data_pos;

if (list_has_space(md->sockets[sock_index].data_list)) {
PRINT_DEBUG("appending store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);
list_append(md->sockets[sock_index].data_list, store);
md->sockets[sock_index].data_buf += ff->dataFrame.pduLength;
md->sockets[sock_index].data_buf += data_len - store->pos;
PRINT_DEBUG("stored, sock_index=%d, ff=%p, meta=%p, data_buf=%d", sock_index, ff, ff->metaData, md->sockets[sock_index].data_buf);
} else {
PRINT_ERROR("data_list full: sock_index=%d, ff=%p", sock_index, ff);
Expand Down
29 changes: 19 additions & 10 deletions trunk/modules/daemon/udpHandling.c
Expand Up @@ -630,7 +630,12 @@ void recvmsg_out_udp(struct fins_module *module, struct wedge_to_daemon_hdr *hdr
if (md->sockets[hdr->sock_index].sockopts.FIP_RECVERR) {
if (md->sockets[hdr->sock_index].error_buf > 0) {
store = (struct daemon_store *) list_remove_front(md->sockets[hdr->sock_index].error_list);
data_len = store->ff->ctrlFrame.data_len;
data = store->ff->ctrlFrame.data;
PRINT_DEBUG("removed store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);

md->sockets[hdr->sock_index].error_buf--;
PRINT_DEBUG("after: sock_index=%d, error_buf=%d", hdr->sock_index, md->sockets[hdr->sock_index].error_buf);

if (store->addr->ss_family == AF_INET) {
addr_len = (uint32_t) sizeof(struct sockaddr_in);
Expand All @@ -651,8 +656,6 @@ void recvmsg_out_udp(struct fins_module *module, struct wedge_to_daemon_hdr *hdr
return;
}

data_len = store->ff->ctrlFrame.data_len;
data = store->ff->ctrlFrame.data;
} else {
//NACK
nack_send(module, hdr->call_id, hdr->call_index, hdr->call_type, 11); //Resource temporarily unavailable
Expand All @@ -668,7 +671,11 @@ void recvmsg_out_udp(struct fins_module *module, struct wedge_to_daemon_hdr *hdr
PRINT_DEBUG("before: sock_index=%d, data_buf=%d", hdr->sock_index, md->sockets[hdr->sock_index].data_buf);
if (md->sockets[hdr->sock_index].data_buf > 0) {
store = (struct daemon_store *) list_remove_front(md->sockets[hdr->sock_index].data_list);
md->sockets[hdr->sock_index].data_buf -= store->ff->dataFrame.pduLength - store->pos;
data_len = store->ff->dataFrame.pduLength;
data = store->ff->dataFrame.pdu;
PRINT_DEBUG("removed store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);

md->sockets[hdr->sock_index].data_buf -= data_len - store->pos;
PRINT_DEBUG("after: sock_index=%d, data_buf=%d", hdr->sock_index, md->sockets[hdr->sock_index].data_buf);

if (store->addr->ss_family == AF_INET) {
Expand All @@ -689,9 +696,6 @@ void recvmsg_out_udp(struct fins_module *module, struct wedge_to_daemon_hdr *hdr
nack_send(module, hdr->call_id, hdr->call_index, hdr->call_type, 1);
return;
}

data_len = store->ff->dataFrame.pduLength;
data = store->ff->dataFrame.pdu;
}
}

Expand Down Expand Up @@ -736,8 +740,10 @@ void recvmsg_out_udp(struct fins_module *module, struct wedge_to_daemon_hdr *hdr
if (flags & MSG_ERRQUEUE) {
daemon_store_free(store);
} else {
store->pos += msg_len;
PRINT_DEBUG("prepending store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);
list_prepend(md->sockets[hdr->sock_index].data_list, store);
md->sockets[hdr->sock_index].data_buf += store->ff->dataFrame.pduLength - store->pos;
md->sockets[hdr->sock_index].data_buf += data_len - store->pos;
}
}

Expand Down Expand Up @@ -1498,17 +1504,19 @@ void daemon_in_fdf_udp(struct fins_module *module, struct finsFrame *ff, uint32_
uint32_t flags = POLLIN;
list_for_each2(md->sockets[sock_index].call_list, poll_in_udp, module, &flags);

uint32_t data_len = ff->dataFrame.pduLength;
uint8_t *data = ff->dataFrame.pdu;
uint32_t data_pos = 0;
flags = 0;
struct daemon_call *call;

while (1) {
call = (struct daemon_call *) list_find1(md->sockets[sock_index].call_list, daemon_call_recvmsg_test, &flags);
if (call != NULL) {
data_pos += recvmsg_in_udp(call, module, ff->metaData, ff->dataFrame.pduLength - data_pos, ff->dataFrame.pdu + data_pos, src_addr, 0);
data_pos += recvmsg_in_udp(call, module, ff->metaData, data_len - data_pos, data + data_pos, src_addr, 0);
list_remove(md->sockets[sock_index].call_list, call);

if (data_pos == ff->dataFrame.pduLength) {
if (data_pos == data_len) {
freeFinsFrame(ff);
return;
}
Expand All @@ -1524,8 +1532,9 @@ void daemon_in_fdf_udp(struct fins_module *module, struct finsFrame *ff, uint32_
store->pos = data_pos;

if (list_has_space(md->sockets[sock_index].data_list)) {
PRINT_DEBUG("appending store: store=%p, ff=%p, data_len=%u, data=%p, pos=%u", store, store->ff, data_len, data, store->pos);
list_append(md->sockets[sock_index].data_list, store);
md->sockets[sock_index].data_buf += ff->dataFrame.pduLength;
md->sockets[sock_index].data_buf += data_len - store->pos;
PRINT_DEBUG("stored, sock_index=%d, ff=%p, meta=%p, data_buf=%d", sock_index, ff, ff->metaData, md->sockets[sock_index].data_buf);
} else {
PRINT_ERROR("data_list full: sock_index=%d, ff=%p", sock_index, ff);
Expand Down
1 change: 0 additions & 1 deletion trunk/modules/rtm/rtm_process.c
Expand Up @@ -640,7 +640,6 @@ void rtm_process_listen(struct fins_module *module, struct rtm_console *console,

void rtm_process_console(struct fins_module *module, struct rtm_console *console, struct rtm_command *cmd) {
PRINT_DEBUG("Entered: module=%p, console=%p, cmd=%p", module, console, cmd);
struct rtm_data *md = (struct rtm_data *) module->data;

if (cmd->words_num < 3) {
PRINT_IMPORTANT("Incorrect usage: console=%p, id=%u, cmd='%s'", console, console->id, cmd->cmd_buf);
Expand Down

0 comments on commit 320f111

Please sign in to comment.