int main(int ac, char *av[]) { char rpath[MAX_NAME_LEN]; int status, *jstatus; simplequeue_t *outputQ, *workQ, *qtoa; pthread_t IGMP_broadcast_thread; // create separate thread for broadcasting IGMP group query messages pthread_create(&IGMP_broadcast_thread, NULL, IGMPBroadcast, NULL); // setup the program properties setupProgram(ac, av); // creates a PID file under router_name.pid in the current directory status = makePIDFile(rconfig.router_name, rpath); // shutdown the router on receiving SIGUSR1 or SIGUSR2 redefineSignalHandler(SIGUSR1, shutdownRouter); redefineSignalHandler(SIGUSR2, shutdownRouter); outputQ = createSimpleQueue("outputQueue", INFINITE_Q_SIZE, 0, 1); workQ = createSimpleQueue("work Queue", INFINITE_Q_SIZE, 0, 1); GNETInit(&(rconfig.ghandler), rconfig.config_dir, rconfig.router_name, outputQ); ARPInit(); IPInit(); classifier = createClassifier(); filter = createFilter(classifier, 0); pcore = createPacketCore(rconfig.router_name, outputQ, workQ); // add a default Queue.. the createClassifier has already added a rule with "default" tag // char *qname, char *dqisc, double qweight, double delay_us, int nslots); addPktCoreQueue(pcore, "default", "taildrop", 1.0, 2.0, 0); rconfig.scheduler = PktCoreSchedulerInit(pcore); rconfig.worker = PktCoreWorkerInit(pcore); infoInit(rconfig.config_dir, rconfig.router_name); addTarget("Output Queue", outputQ); qtoa = getCoreQueue(pcore, "default"); if (qtoa != NULL) addTarget("Default Queue", qtoa); else printf("Error .. found null queue for default\n"); // start the CLI.. CLIInit(&(rconfig)); wait4thread(rconfig.scheduler); wait4thread(rconfig.worker); wait4thread(rconfig.ghandler); wait4thread(IGMP_broadcast_thread); }
/* * queue add class_name qdisc_name [-size num_slots] [-weight value] [-delay delay_microsec] * queue show * queue del queue_number * queue mod queue_number [-weight value] [-delay delay_microsec] * queue stats [queue_number] */ void queueCmd() { char *next_tok; char cname[MAX_DNAME_LEN], qdisc[MAX_DNAME_LEN]; // the following parameters are set to default values which are sometimes overwritten int num_slots = 0; // means, set to default double weight = 1.0, delay = 2.0; if ((next_tok = strtok(NULL, " \n")) != NULL) { if (!strcmp(next_tok, "add")) { next_tok = strtok(NULL, " \n"); strcpy(cname, next_tok); if (getClassDef(classifier, cname) == NULL) { verbose(1, "[queue]:: class name %s not defined ..", cname); return; } next_tok = strtok(NULL, " \n"); strcpy(qdisc, next_tok); if (lookupQDisc(pcore->qdiscs, qdisc) < 0) { verbose(1, "[queue]:: qdisc %s not defined .. ", qdisc); return; } while ((next_tok = strtok(NULL, " \n")) != NULL) { if (!strcmp(next_tok, "-size")) { next_tok = strtok(NULL, " \n"); num_slots = atoi(next_tok); } else if (!strcmp(next_tok, "-weight")) { next_tok = strtok(NULL, " \n"); weight = atof(next_tok); } else if (!strcmp(next_tok, "-delay")) { next_tok = strtok(NULL, " \n"); delay = atof(next_tok); } } addPktCoreQueue(pcore, cname, qdisc, weight, delay, num_slots); } else if (!strcmp(next_tok, "show")) printAllQueues(pcore); else if (!strcmp(next_tok, "del")) { if ((next_tok = strtok(NULL, " \n")) != NULL) delPktCoreQueue(pcore, next_tok); } else if (!strcmp(next_tok, "mod")) { if ((next_tok = strtok(NULL, " \n")) != NULL) { strcpy(cname, next_tok); if ((next_tok = strtok(NULL, " \n")) != NULL) { if (!strcmp(next_tok, "-weight")) { next_tok = strtok(NULL, " \n"); weight = atof(next_tok); modifyQueueWeight(pcore, cname, weight); } else if (!strcmp(next_tok, "-qdisc")) { next_tok = strtok(NULL, " \n"); modifyQueueDiscipline(pcore, cname, next_tok); } } } } else if (!strcmp(next_tok, "stats")) printQueueStats(pcore); } }
int main(int ac, char *av[]) { char rpath[MAX_NAME_LEN]; int status, *jstatus; simplequeue_t *outputQ, *workQ, *qtoa; // setup the program properties setupProgram(ac, av); // creates a PID file under router_name.pid in the current directory status = makePIDFile(rconfig.router_name, rpath); // shutdown the router on receiving SIGUSR1 or SIGUSR2 redefineSignalHandler(SIGUSR1, shutdownRouter); redefineSignalHandler(SIGUSR2, shutdownRouter); outputQ = createSimpleQueue("outputQueue", INFINITE_Q_SIZE, 0, 1); workQ = createSimpleQueue("work Queue", INFINITE_Q_SIZE, 0, 1); GNETInit(&(rconfig.ghandler), rconfig.config_dir, rconfig.router_name, outputQ); ARPInit(); IPInit(); init_ports(); init_tcp(); /*uint32_t dest_ip = 12319800; uint16_t dest_port = 123; uint16_t src_port = 456; char *data = "Hello"; int len = 6; send_udp(dest_ip,dest_port,src_port,data,len);*/ /* *Test udp_recv * */ /*open_port(1, UDP_PROTOCOL); gpacket_t *packet = (gpacket_t *) malloc(sizeof(gpacket_t)); ip_packet_t *ipPacket = (ip_packet_t *)(packet->data.data); ipPacket->ip_src = {0x1,0x1,0x1,0x1}; ipPacket->ip_dst = {0x2,0x2,0x2,0x2}; ipPacket->ip_cksum = 65535; ipPacket->ip_pkt_len = ipPacket->ip_hdr_len; udphdr_t *udpHeader = (udphdr_t *)((uchar *)ipPacket + ipPacket->ip_hdr_len*4); udpHeader->source = 0; // ports udpHeader->dest = 1; udpHeader->len = 0; // length of data in octets udpHeader->check = 65535; udp_recv(packet); free(packet); free(ipPacket); free(udpHeader);*/ /* * * * End test udp_recv * */ printf("dis router"); classifier = createClassifier(); filter = createFilter(classifier, 0); pcore = createPacketCore(rconfig.router_name, outputQ, workQ); // add a default Queue.. the createClassifier has already added a rule with "default" tag // char *qname, char *dqisc, double qweight, double delay_us, int nslots); addPktCoreQueue(pcore, "default", "taildrop", 1.0, 2.0, 0); rconfig.scheduler = PktCoreSchedulerInit(pcore); rconfig.worker = PktCoreWorkerInit(pcore); infoInit(rconfig.config_dir, rconfig.router_name); addTarget("Output Queue", outputQ); qtoa = getCoreQueue(pcore, "default"); if (qtoa != NULL) addTarget("Default Queue", qtoa); else printf("Error .. found null queue for default\n"); // start the CLI.. CLIInit(&(rconfig)); wait4thread(rconfig.scheduler); wait4thread(rconfig.worker); wait4thread(rconfig.ghandler); }