Пример #1
0
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;
}
Пример #2
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;
}