/* 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; }
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; }
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; }
/* 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; }
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; }
/* 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; }
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); } }
/* 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; }
/* * 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); }
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); }
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); }
/* * 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); }