Example #1
0
/* Get Error from ksocket node if any */
int GetKsocketError(char path[NG_PATHSIZ]) {
    struct ng_ksocket_sockopt *sockopt_resp = malloc(sizeof(struct ng_ksocket_sockopt) + sizeof(int)); 
    struct ng_mesg *resp;
    memset(sockopt_resp, 0, sizeof(struct ng_ksocket_sockopt) + sizeof(int));

    sockopt_resp->level = SOL_SOCKET;
    sockopt_resp->name = SO_ERROR;
    NgSetDebug(3);
    if ( NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_GETOPT, 
                            sockopt_resp, sizeof(*sockopt_resp)) == -1 ) {
        printf("Error while trying to get sockopt from %s - %s\n", 
                        path, strerror(errno));
        return 1;
    }
    if ( NgAllocRecvMsg(csock, &resp, 0 ) < 0 ) {
        fprintf(stderr, "Error while trying to get message from getsockopt: %s\n", strerror(errno));
        return 1;
    }

    int sockError = *((struct ng_ksocket_sockopt *)resp->data)->value; 
    if (sockError != 0) { 
        printf("Error = %d string = %s\n", sockError, strerror(sockError));
    }
    free(sockopt_resp);
    free(resp);
    return 1;
}
Example #2
0
int GetKsocketReuseAddr (char path[NG_PATHSIZ]) {
    struct ng_ksocket_sockopt *sockopt_resp = malloc(sizeof(struct ng_ksocket_sockopt) + sizeof(int)); 
    struct ng_mesg *resp;
    memset(sockopt_resp, 0, sizeof(struct ng_ksocket_sockopt) + sizeof(int));

    sockopt_resp->level = SOL_SOCKET;
    sockopt_resp->name = SO_REUSEPORT;
    if ( NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_GETOPT, 
                            sockopt_resp, sizeof(*sockopt_resp)) == -1 ) {
        printf("Error while trying to get sockopt from %s - %s\n", 
                        path, strerror(errno));
        return 1;
    }
    if ( NgAllocRecvMsg(csock, &resp, 0 ) < 0 ) {
        fprintf(stderr, "Error while trying to get message from getsockopt: %s\n", strerror(errno));
        return 1;
    }
    int *option = (int *)((struct ng_ksocket_sockopt *)&resp->data)->value; 
    printf("REUSEADDR = %d\n", htons(*option));
     
    free(sockopt_resp);
    free(resp);
    return 1;

}
Example #3
0
int GetKsocketTcpInfo (char path[NG_PATHSIZ]) {
    struct ng_ksocket_sockopt *sockopt_resp = malloc(sizeof(struct ng_ksocket_sockopt) + sizeof(int)); 
    struct ng_mesg *resp;
    memset(sockopt_resp, 0, sizeof(struct ng_ksocket_sockopt) + sizeof(int));

    sockopt_resp->level = IPPROTO_TCP;
    sockopt_resp->name = TCP_INFO;
    //NgSetDebug(3);
    if ( NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_GETOPT, 
                            sockopt_resp, sizeof(*sockopt_resp)) == -1 ) {
        printf("Error while trying to get sockopt from %s - %s\n", 
                        path, strerror(errno));
        return 1;
    }
    if ( NgAllocRecvMsg(csock, &resp, 0 ) < 0 ) {
        fprintf(stderr, "Error while trying to get message from getsockopt: %s\n", strerror(errno));
        return 1;
    }
    printf("resp.arglen = %d sizeof(struct tcp_info) = %lu\n", resp->header.arglen, sizeof(struct tcp_info)+sizeof(struct ng_ksocket_sockopt)); 
    struct tcp_info *info;
    info = (struct tcp_info *)((struct ng_ksocket_sockopt *)resp->data)->value;
    tcp_info_print(info);
    free(sockopt_resp);
    free(resp);
    return 1;
}
Example #4
0
/* GET NO DELAY*/
int GetNoDelay ( char path[NG_PATHSIZ] )  {
    struct ng_ksocket_sockopt *sockopt = malloc(sizeof(struct ng_ksocket_sockopt) + sizeof(int));
    struct ng_mesg *resp;

	// setsockopt resolve TIME_WAIT problem
	// setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,&one,sizeof(int)) < 0)

	sockopt->level = IPPROTO_TCP;
	sockopt->name = TCP_NODELAY;

	if (NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_GETOPT,
			sockopt, sizeof(struct ng_ksocket_sockopt)) == -1) {
		fprintf(stderr, "%s(): Sockopt set failed : %s\n", __FUNCTION__,
				strerror(errno));
		return -1;
	}

    if (NgAllocRecvMsg(csock, &resp, 0) < 0 ) {
        fprintf(stderr, "Error receiving answer to getsockopt: %s\n", strerror(errno));
        return 1;
    }
    printf("TCP_NODELAY = %d\n", *((struct ng_ksocket_sockopt *)resp->data)->value );

    free(resp);
	return 1;
}
Example #5
0
int GetKsocketSendBuf (char path[NG_PATHSIZ]) {
    struct ng_ksocket_sockopt *sockopt_resp = malloc(sizeof(struct ng_ksocket_sockopt) + sizeof(int)); 
    struct ng_ksocket_sockopt *sk;
    struct ng_mesg *resp;
    memset(sockopt_resp, 0, sizeof(struct ng_ksocket_sockopt) + sizeof(int));

    sockopt_resp->level = SOL_SOCKET;
    sockopt_resp->name = SO_SNDBUF;
    if ( NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_GETOPT, 
                            sockopt_resp, sizeof(*sockopt_resp)) == -1 ) {
        printf("Error while trying to get sockopt from %s - %s\n", 
                        path, strerror(errno));
        return 1;
    }
    if ( NgAllocRecvMsg(csock, &resp, 0 ) < 0 ) {
        fprintf(stderr, "Error while trying to get message from getsockopt: %s\n", strerror(errno));
        return 1;
    }
    sk = (struct ng_ksocket_sockopt *)resp->data;
    int option = *((int *)sk->value); 
    printBytes(sk, resp->header.arglen);
    printf("SO_SNDBUF = %d\n", option);
     
    free(sockopt_resp);
    free(resp);
    return 1;
}
Example #6
0
/* Get TOS field value from ksocket node */ 
int GetKsocketTos(char path[NG_PATHSIZ]) {
    struct ng_ksocket_sockopt *sockopt_resp = malloc(sizeof(struct ng_ksocket_sockopt) + sizeof(int)); 
    struct ng_mesg *resp;
    
    memset(sockopt_resp, 0, sizeof(struct ng_ksocket_sockopt) + sizeof(int));
    sockopt_resp->level = IPPROTO_IP;
    sockopt_resp->name = IP_TOS;
    if ( NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_GETOPT, 
                            sockopt_resp, sizeof(*sockopt_resp)) == -1 ) {
        printf("Error while trying to get sockopt from %s - %s\n", 
                        path, strerror(errno));
        return 1;
    }
    if ( NgAllocRecvMsg(csock, &resp, 0 ) < 0 ) {
        printf("Error while trying to get message from getsockopt\n");
        return 1;
    }
    struct ng_ksocket_sockopt *resp_sockopt = (struct ng_ksocket_sockopt *)resp->data;
    int tos = *((int *)resp_sockopt->value);
    printf("%s:%d tos in resp = %d\n", __FILE__, __LINE__, tos); 
    free(sockopt_resp);
    free(resp);
    
    return 1;
}
Example #7
0
int ListenNgKsocket() {
    char path[NG_PATHSIZ];
    int token;
    
    struct ng_mesg *m;
    struct accept_response {
        int node_id;
        struct sockaddr_in client;
    } *resp;
    
    memset(path, 0, sizeof(path));
    printf("%s serving connections\n", __func__); 
    for (;;) {
        if ( NgAllocRecvMsg(csock, &m, path) < 0 ) {
            printf("%s(): Error receiving message : %s\n", __func__, strerror(errno));
            return -1;
        }
        resp = (struct accept_response *)m->data;
        printf("new client nod = %s token = %d arglen = %d\n", path, m->header.token, m->header.arglen);
        printf("client_node_id = %08X client_address = %s:%d\n", resp->node_id, 
                inet_ntoa(resp->client.sin_addr), 
                htons(resp->client.sin_port)
        );
        sendAccept(ksock_name);
        free(m);
    }
}
Example #8
0
/* Set TOS field value of ksocket */
int SetKsocketTos (char path[NG_PATHSIZ]) {
	int tos;
	union {
		u_char buf[sizeof(struct ng_ksocket_sockopt) + sizeof(int)];
		struct ng_ksocket_sockopt sockopt;
	} sockopt_buf;
	struct ng_ksocket_sockopt * const sockopt = &sockopt_buf.sockopt;
	struct ng_ksocket_sockopt *sockopt_resp = malloc(sizeof(struct ng_ksocket_sockopt) + sizeof(int));
	struct ng_mesg *m;

	// set dscp value 32 for socket
	sockopt->level = IPPROTO_IP;
	sockopt->name = IP_TOS;
	tos = IPTOS_DSCP_CS4;
	memcpy(sockopt->value, &tos, sizeof(tos));
	if (NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_SETOPT,
			sockopt, sizeof(sockopt_buf) ) == -1) {
		fprintf(stderr, "%s(): Sockopt set failed : %s\n", __FUNCTION__,
				strerror(errno));
		return 0;
	} else  {
		memset(sockopt_resp, 0, sizeof(struct ng_ksocket_sockopt) + sizeof(int));
		sockopt_resp->level = IPPROTO_IP;
		sockopt_resp->name = IP_TOS;
		// Trying to get option we just set
		if (NgSendMsg(csock, path, NGM_KSOCKET_COOKIE, NGM_KSOCKET_GETOPT,
        		sockopt_resp, sizeof(*sockopt_resp)) == -1) {
        	fprintf(stderr, "%s() can`t get sockopt from address :%s because : %s\n", __FUNCTION__,
        			path, strerror(errno));
        	return 0;
        }

		if (NgAllocRecvMsg(csock, &m, NULL) < 0) {
			fprintf(stderr,  "%s() Error receiving response\n", __FUNCTION__);
		} else {
			fprintf(stderr, "%s() message received dscp = %d trying to set = %d another value = %d\n",
					__FUNCTION__, *((struct ng_ksocket_sockopt *)m->data)->value, IPTOS_DSCP_CS4, *sockopt_resp->value );
			free(m);
		}

		//fprintf(stderr, "%s(): sockopt_resp.value = 0x%08x must be = 0x%08x",
		//		__FUNCTION__, sockopt_resp->value, IPTOS_DSCP_CS4);

        //sockopt_resp = (struct ng_ksocket_sockopt *)m->data;
        //Log(LOG_NOTICE, "%s(): m->header.token = %d sockopt->value = %s"
        //		, __FUNCTION__,
		//		m->header.token, sockopt_resp->value);

		//fprintf(stderr, "%s() tos = %d set for socket success", __FUNCTION__, tos);
        return 1;
    }
	return 1;
}
Example #9
0
/*
 * Read and display the next incoming control message
 */
void
MsgRead(void)
{
	struct ng_mesg *m, *m2;
	struct ng_mesg *ascii;
	char path[NG_PATHSIZ];

	/* Get incoming message (in binary form) */
	if (NgAllocRecvMsg(csock, &m, path) < 0) {
		warn("recv incoming message");
		return;
	}

	/* Ask originating node to convert message to ASCII */
	if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE,
	      NGM_BINARY2ASCII, m, sizeof(*m) + m->header.arglen) < 0
	    || NgAllocRecvMsg(csock, &m2, NULL) < 0) {
		printf("Rec'd %s %d from \"%s\":\n",
		    (m->header.flags & NGF_RESP) != 0 ? "response" : "command",
		    m->header.cmd, path);
		if (m->header.arglen == 0)
			printf("No arguments\n");
		else
			DumpAscii((const u_char *)m->data, m->header.arglen);
		free(m);
		return;
	}

	/* Display message in ASCII form */
	free(m);
	ascii = (struct ng_mesg *)m2->data;
	printf("Rec'd %s \"%s\" (%d) from \"%s\":\n",
	    (ascii->header.flags & NGF_RESP) != 0 ? "response" : "command",
	    ascii->header.cmdstr, ascii->header.cmd, path);
	if (*ascii->data != '\0')
		printf("Args:\t%s\n", ascii->data);
	else
		printf("No arguments\n");
	free(m2);
}
Example #10
0
static int
DotCmd(int ac, char **av)
{
	struct ng_mesg *nlresp;
	struct namelist *nlist;
	FILE *f = stdout;
	int ch;
	u_int i;

	/* Get options */
	optind = 1;
	while ((ch = getopt(ac, av, "")) != -1) {
		switch (ch) {
		case '?':
		default:
			return (CMDRTN_USAGE);
			break;
		}
	}
	ac -= optind;
	av += optind;

	/* Get arguments */
	switch (ac) {
	case 1:
		f = fopen(av[0], "w");
		if (f == NULL) {
			warn("Could not open %s for writing", av[0]);
			return (CMDRTN_ERROR);
		}
	case 0:
		break;
	default:
		if (f != stdout)
			(void)fclose(f);
		return (CMDRTN_USAGE);
	}

	/* Get list of nodes */
	if (NgSendMsg(csock, ".", NGM_GENERIC_COOKIE, NGM_LISTNODES, NULL,
	    0) < 0) {
		warn("send listnodes msg");
		goto error;
	}
	if (NgAllocRecvMsg(csock, &nlresp, NULL) < 0) {
		warn("recv listnodes msg");
		goto error;
	}

	nlist = (struct namelist *)nlresp->data;
	fprintf(f, "graph netgraph {\n");
	/* TODO: implement rank = same or subgraphs at some point */
	fprintf(f, "\tedge [ weight = 1.0 ];\n");
	fprintf(f, "\tnode [ shape = record, fontsize = 12 ] {\n");
	for (i = 0; i < nlist->numnames; i++)
		fprintf(f, "\t\t\"%jx\" [ label = \"{%s:|{%s|[%jx]:}}\" ];\n",
		    (uintmax_t)nlist->nodeinfo[i].id,
		    nlist->nodeinfo[i].name[0] != '\0' ?
		    nlist->nodeinfo[i].name : UNNAMED,
		    nlist->nodeinfo[i].type, (uintmax_t)nlist->nodeinfo[i].id);
	fprintf(f, "\t};\n");

	fprintf(f, "\tsubgraph cluster_disconnected {\n");
	fprintf(f, "\t\tbgcolor = pink;\n");
	for (i = 0; i < nlist->numnames; i++)
		if (nlist->nodeinfo[i].hooks == 0)
			fprintf(f, "\t\t\"%jx\";\n",
			    (uintmax_t)nlist->nodeinfo[i].id);
	fprintf(f, "\t};\n");

	for (i = 0; i < nlist->numnames; i++) {
		struct ng_mesg *hlresp;
		struct hooklist *hlist;
		struct nodeinfo *ninfo;
		char path[NG_PATHSIZ];
		u_int j;

		(void)snprintf(path, sizeof(path), "[%jx]:",
		    (uintmax_t)nlist->nodeinfo[i].id);

		/* Get node info and hook list */
		if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE, NGM_LISTHOOKS,
		    NULL, 0) < 0) {
			free(nlresp);
			warn("send listhooks msg");
			goto error;
		}
		if (NgAllocRecvMsg(csock, &hlresp, NULL) < 0) {
			free(nlresp);
			warn("recv listhooks msg");
			goto error;
		}

		hlist = (struct hooklist *)hlresp->data;
		ninfo = &hlist->nodeinfo;
		if (ninfo->hooks == 0) {
			free(hlresp);
			continue;
		}

		fprintf(f, "\tnode [ shape = octagon, fontsize = 10 ] {\n");
		for (j = 0; j < ninfo->hooks; j++)
			fprintf(f, "\t\t\"%jx.%s\" [ label = \"%s\" ];\n",
			    (uintmax_t)nlist->nodeinfo[i].id,
			    hlist->link[j].ourhook, hlist->link[j].ourhook);
		fprintf(f, "\t};\n");

		fprintf(f, "\t{\n\t\tedge [ weight = 2.0, style = bold ];\n");
		for (j = 0; j < ninfo->hooks; j++)
			fprintf(f, "\t\t\"%jx\" -- \"%jx.%s\";\n",
			    (uintmax_t)nlist->nodeinfo[i].id,
			    (uintmax_t)nlist->nodeinfo[i].id,
			    hlist->link[j].ourhook);
		fprintf(f, "\t};\n");

		for (j = 0; j < ninfo->hooks; j++) {
			/* Only print the edges going in one direction. */
			if (hlist->link[j].nodeinfo.id > nlist->nodeinfo[i].id)
				continue;
			fprintf(f, "\t\"%jx.%s\" -- \"%jx.%s\";\n",
			    (uintmax_t)nlist->nodeinfo[i].id,
			    hlist->link[j].ourhook,
			    (uintmax_t)hlist->link[j].nodeinfo.id,
			    hlist->link[j].peerhook);
		}
		free(hlresp);
	}

	fprintf(f, "};\n");

	free(nlresp);
	if (f != stdout)
		(void)fclose(f);
	return (CMDRTN_OK);
error:
	if (f != stdout)
		(void)fclose(f);
	return (CMDRTN_ERROR);
}
Example #11
0
static int
ShowCmd(int ac, char **av)
{
	char *path;
	struct ng_mesg *resp;
	struct hooklist *hlist;
	struct nodeinfo *ninfo;
	int ch, no_hooks = 0;

	/* Get options */
	optind = 1;
	while ((ch = getopt(ac, av, "n")) != -1) {
		switch (ch) {
		case 'n':
			no_hooks = 1;
			break;
		case '?':
		default:
			return (CMDRTN_USAGE);
			break;
		}
	}
	ac -= optind;
	av += optind;

	/* Get arguments */
	switch (ac) {
	case 1:
		path = av[0];
		break;
	default:
		return (CMDRTN_USAGE);
	}

	/* Get node info and hook list */
	if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE,
	    NGM_LISTHOOKS, NULL, 0) < 0) {
		warn("send msg");
		return (CMDRTN_ERROR);
	}
	if (NgAllocRecvMsg(csock, &resp, NULL) < 0) {
		warn("recv msg");
		return (CMDRTN_ERROR);
	}

	/* Show node information */
	hlist = (struct hooklist *) resp->data;
	ninfo = &hlist->nodeinfo;
	if (!*ninfo->name)
		snprintf(ninfo->name, sizeof(ninfo->name), "%s", UNNAMED);
	printf("  Name: %-15s Type: %-15s ID: %08x   Num hooks: %d\n",
	    ninfo->name, ninfo->type, ninfo->id, ninfo->hooks);
	if (!no_hooks && ninfo->hooks > 0) {
		u_int k;

		printf(FMT, "Local hook", "Peer name",
		    "Peer type", "Peer ID", "Peer hook");
		printf(FMT, "----------", "---------",
		    "---------", "-------", "---------");
		for (k = 0; k < ninfo->hooks; k++) {
			struct linkinfo *const link = &hlist->link[k];
			struct nodeinfo *const peer = &hlist->link[k].nodeinfo;
			char idbuf[20];

			if (!*peer->name) {
				snprintf(peer->name, sizeof(peer->name),
				  "%s", UNNAMED);
			}
			snprintf(idbuf, sizeof(idbuf), "%08x", peer->id);
			printf(FMT, link->ourhook, peer->name,
			    peer->type, idbuf, link->peerhook);
		}
	}
	free(resp);
	return (CMDRTN_OK);
}
Example #12
0
/*
 * Send a message given in ASCII format. We first ask the node to translate
 * the command into binary, and then we send the binary.
 */
int
NgSendAsciiMsg(int cs, const char *path, const char *fmt, ...)
{
	struct ng_mesg *reply, *binary, *ascii;
	char *buf, *cmd, *args;
	va_list fmtargs;
	int token;

	/* Parse out command and arguments */
	va_start(fmtargs, fmt);
	vasprintf(&buf, fmt, fmtargs);
	va_end(fmtargs);
	if (buf == NULL)
		return (-1);

	/* Parse out command, arguments */
	for (cmd = buf; isspace(*cmd); cmd++)
		;
	for (args = cmd; *args != '\0' && !isspace(*args); args++)
		;
	if (*args != '\0') {
		while (isspace(*args))
			*args++ = '\0';
	}

	/* Get a bigger buffer to hold inner message header plus arg string */
	if ((ascii = malloc(sizeof(struct ng_mesg)
	    + strlen(args) + 1)) == NULL) {
		free(buf);
		return (-1);
	}
	memset(ascii, 0, sizeof(*ascii));

	/* Build inner header (only need cmdstr, arglen, and data fields) */
	strncpy((char *)ascii->header.cmdstr, cmd,
	    sizeof(ascii->header.cmdstr) - 1);
	strcpy(ascii->data, args);
	ascii->header.arglen = strlen(ascii->data) + 1;
	free(buf);

	/* Send node a request to convert ASCII to binary */
	if (NgSendMsg(cs, path, NGM_GENERIC_COOKIE, NGM_ASCII2BINARY,
	    (u_char *)ascii, sizeof(*ascii) + ascii->header.arglen) < 0) {
		free(ascii);
		return (-1);
	}
	free(ascii);

	/* Get reply */
	if (NgAllocRecvMsg(cs, &reply, NULL) < 0)
		return (-1);

	/* Now send binary version */
	binary = (struct ng_mesg *)reply->data;
	if (++gMsgId < 0)
		gMsgId = 1;
	binary->header.token = gMsgId;
	binary->header.version = NG_VERSION;
	if (NgDeliverMsg(cs,
	    path, binary, binary->data, binary->header.arglen) < 0) {
		free(reply);
		return (-1);
	}
	token = binary->header.token;
	free(reply);
	return (token);
}