static int sendRequest(int socket_to_server, struct reg_request *reg_request) { DPRINTF("Sending the following request:\n"); dprint_req(reg_request); if(writen(socket_to_server, (const char *) reg_request, sizeof (struct reg_request)) < sizeof(struct reg_request)) { perror("write"); DPRINTF("Error on write\n"); return -1; } if(readn(socket_to_server, (char *) reg_request, sizeof(struct reg_request)) < sizeof(struct reg_request)) { perror("read"); DPRINTF("Error on read\n"); return -1; } DPRINTF("Received the following response:\n"); dprint_req(reg_request); return 0; }
/* Implements the register protocol: * - Read which device * - Read request (struct reg_request) * - Return result */ int parse_request(int socket_to_client, struct nf2device **nf2devices, int num_netfpgas) { int nread; struct reg_request req; /* Read the request struct */ while ( (nread=readn(socket_to_client, (char *)&req, sizeof(struct reg_request))) == sizeof(struct reg_request)) { DPRINTF("Received reg_request:\n"); dprint_req(&req); /* execute request */ if (req.device_num < num_netfpgas) { DPRINTF("Device num checks out.\n"); if (req.type == READ_REQ) { DPRINTF("Executing read.\n"); readReg(nf2devices[req.device_num], req.address, &req.data); } else if (req.type == WRITE_REQ) { DPRINTF("Executing write.\n"); writeReg(nf2devices[req.device_num], req.address, req.data); } else if (req.type == CHECK_REQ) { DPRINTF("Executing check.\n"); req.data = 1; } else if (req.type == OPEN_REQ) { DPRINTF("Executing open.\n"); req.data = 1; } else if (req.type == CLOSE_REQ) { DPRINTF("Executing close.\n"); DPRINTF("Sending response:\n"); dprint_req(&req); if (writen(socket_to_client, (const char *)&req, sizeof(struct reg_request)) < sizeof(struct reg_request)) { fprintf(stderr, "Error: could not write to client.\n"); return -1; } return 0; } else { fprintf(stderr, "Error: Unknown request type %u.\n", req.type); req.error = -1; } } else { DPRINTF("Device number bad.\n"); if (req.type == CHECK_REQ) { DPRINTF("Executing check_req.\n"); req.data = 0; } else { DPRINTF("Executing else.\n"); req.error = -1; } } /* send response */ DPRINTF("Sending response:\n"); dprint_req(&req); if (writen(socket_to_client, (const char *)&req, sizeof(struct reg_request)) < sizeof(struct reg_request)) { fprintf(stderr, "Error: could not write to client.\n"); return -1; } } if (nread == 0) { return 0; } else if (nread < 0) { fprintf(stderr, "Error reading the reg_request struct.\n"); return -1; } else if (nread < sizeof(struct reg_request)) { fprintf(stderr, "Error: Did not read full reg_request struct.\n"); return -1; } return 0; }