Instruction on how to use the classifier is all documented in the header files of the code itself. Look at /afs/cs.cmu.edu/project/cmcl-darwin/netbsd/pkt_classifier/*.h for detail. In a nutshell, you can add a class, then you can modify the class, move the class, or delete the class. Here is an example on how to make the ioctl call. #include #include int sockfd; create_class_t newClass; if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0) { printf ("Cannot open socket\n"); exit (1); } bzero(&newClass, sizeof(create_class_t)); strcpy(newClass.ifName, hInfo.ifName); newClass.link_option = BY_FILTER; newClass.resvProt = GUI; newClass.filt_info.fSrcAddr = ntohl(inet_addr(argv[1])); newClass.filt_info.fSrcMask = ntohl(inet_addr(argv[2])); newClass.filt_info.fSrcMskd = newClass.filt_info.fSrcAddr & newClass.filt_info.fSrcMask; newClass.filt_info.fDstAddr = ntohl(inet_addr(argv[3])); newClass.filt_info.fDstMask = ntohl(inet_addr(argv[4])); newClass.filt_info.fDstMskd = newClass.filt_info.fDstAddr & newClass.filt_info.fDstMask; newClass.filt_info.fProto = atoi(argv[5]); newClass.filt_info.fSrcPort = (short)atoi(argv[6]); newClass.filt_info.fDstPort = (short)atoi(argv[7]); newClass.service_curve.m1 = atoi(argv[8]); newClass.service_curve.d = atoi(argv[9]); newClass.service_curve.m2 = atoi(argv[10]); ioctl(sockfd, CLASSIFIER_CREATE_CLASS, &newClass); if ( newClass.classID == 0 ) { sprintf(interp->result,"error"); }