4 * Operations to compute and dump SNMPv3 PDU sizes.
6 * Copyright (c) 2003 J. Schoenwaelder, International University Bremen.
8 * See the file "COPYING" for information on usage and redistribution
9 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
11 * @(#) $Id: dump-sizes.c 8090 2008-04-18 12:56:29Z strauss $
25 static int silent = 0;
26 static int detail = 0;
31 #define m_abs(a) ((a) < 0 ? -(a) : (a))
33 typedef struct WellKnowType {
41 static WellKnowType specialTypes[] = {
42 { "SNMPv2-TC", "PhysAddress", 65535, 6, 0 },
43 { "INET-ADDRESS-MIB", "InetAddress", 255, 4, 0 },
44 { "IANATn3270eTC-MIB", "IANATn3270eAddress", 255, 4, 0 },
45 { NULL, NULL, 0, 0, 0 }
50 typedef enum len_type {
59 getAbsMinEnum(SmiType *smiType)
62 SmiInteger32 min = SMI_BASETYPE_INTEGER32_MAX;
64 for (nn = smiGetFirstNamedNumber(smiType);
66 nn = smiGetNextNamedNumber(nn)) {
67 if (abs(nn->value.value.integer32) < min) {
68 min = abs(nn->value.value.integer32);
77 getAbsMaxEnum(SmiType *smiType)
82 for (nn = smiGetFirstNamedNumber(smiType);
84 nn = smiGetNextNamedNumber(nn)) {
85 if (abs(nn->value.value.integer32) > max) {
86 max = abs(nn->value.value.integer32);
95 getAbsMinInteger32(SmiType *smiType)
99 SmiInteger32 min = SMI_BASETYPE_INTEGER32_MAX;
101 range = smiGetFirstRange(smiType);
103 parent = smiGetParentType(smiType);
104 return parent ? getAbsMinInteger32(parent) : 0;
107 for (; range; range = smiGetNextRange(range)) {
108 if (abs(range->minValue.value.integer32) < min) {
109 min = abs(range->minValue.value.integer32);
118 getAbsMaxInteger32(SmiType *smiType)
122 SmiInteger32 max = SMI_BASETYPE_INTEGER32_MIN;
124 range = smiGetFirstRange(smiType);
126 parent = smiGetParentType(smiType);
128 ? getAbsMaxInteger32(parent) : SMI_BASETYPE_INTEGER32_MAX;
131 for (; range; range = smiGetNextRange(range)) {
132 if (abs(range->maxValue.value.integer32) > max) {
133 max = abs(range->maxValue.value.integer32);
142 getMinUnsigned32(SmiType *smiType)
146 SmiInteger32 min = 0xffffffff;
148 range = smiGetFirstRange(smiType);
150 parent = smiGetParentType(smiType);
151 return parent ? getMinUnsigned32(parent) : 0;
154 for (; range; range = smiGetNextRange(range)) {
155 if (range->minValue.value.unsigned32 < min) {
156 min = range->minValue.value.unsigned32;
165 getMaxUnsigned32(SmiType *smiType)
169 SmiUnsigned32 max = 0;
171 range = smiGetFirstRange(smiType);
173 parent = smiGetParentType(smiType);
174 return parent ? getMaxUnsigned32(parent) : 0xffffffff;
177 for (; range; range = smiGetNextRange(range)) {
178 if (range->maxValue.value.unsigned32 > max) {
179 max = range->maxValue.value.unsigned32;
188 getAbsMinInteger64(SmiType *smiType)
192 SmiInteger64 min = SMI_BASETYPE_INTEGER64_MAX;
194 range = smiGetFirstRange(smiType);
196 parent = smiGetParentType(smiType);
197 return parent ? getAbsMinInteger64(parent) : min;
200 for (; range; range = smiGetNextRange(range)) {
201 if (m_abs(range->minValue.value.integer64) < min) {
202 min = m_abs(range->minValue.value.integer64);
211 getAbsMaxInteger64(SmiType *smiType)
215 SmiInteger64 max = SMI_BASETYPE_INTEGER64_MIN;
217 range = smiGetFirstRange(smiType);
219 parent = smiGetParentType(smiType);
220 return parent ? getAbsMaxInteger64(parent) : max;
223 for (; range; range = smiGetNextRange(range)) {
224 if (m_abs(range->maxValue.value.integer64) > max) {
225 max = m_abs(range->maxValue.value.integer64);
234 getMinUnsigned64(SmiType *smiType)
238 SmiInteger64 min = SMI_BASETYPE_UNSIGNED64_MAX;
240 range = smiGetFirstRange(smiType);
242 parent = smiGetParentType(smiType);
243 return parent ? getMinUnsigned64(parent) : min;
246 for (; range; range = smiGetNextRange(range)) {
247 if (range->minValue.value.unsigned64 < min) {
248 min = range->minValue.value.unsigned64;
257 getMaxUnsigned64(SmiType *smiType)
261 SmiUnsigned64 max = SMI_BASETYPE_UNSIGNED64_MIN;
263 range = smiGetFirstRange(smiType);
265 parent = smiGetParentType(smiType);
266 return parent ? getMaxUnsigned64(parent) : max;
269 for (; range; range = smiGetNextRange(range)) {
270 if (range->maxValue.value.unsigned64 > max) {
271 max = range->maxValue.value.unsigned64;
280 ber_len_length(int length)
288 for (len = 0; length > 0; len++) {
297 ber_len_subid(SmiSubid subid)
311 ber_len_oid(const SmiSubid *oid, unsigned int oidlen)
316 len += ber_len_subid(oid[1] + oid[0] * 40);
317 for (i = 2; i < oidlen; i++) {
318 len += ber_len_subid(oid[i]);
321 len += ber_len_length(len); /* length */
329 ber_len_int32(const SmiInteger32 value)
331 SmiInteger32 val = value;
332 unsigned char ch, sign;
344 ch = (unsigned char) val;
347 } while ((val != lim) || (unsigned char) (ch & 0x80) != sign);
349 len += ber_len_length(len); /* length */
357 ber_len_uint32(const SmiUnsigned32 value)
359 SmiUnsigned32 val = value;
364 ch = (unsigned char) val;
367 } while ((val != 0) || (ch & 0x80) != 0x00);
369 len += ber_len_length(len); /* length */
377 ber_len_int64(const SmiInteger64 value)
379 SmiInteger64 val = value;
380 unsigned char ch, sign;
392 ch = (unsigned char) val;
395 } while ((val != lim) || (unsigned char) (ch & 0x80) != sign);
397 len += ber_len_length(len); /* length */
405 ber_len_uint64(const SmiUnsigned64 value)
407 SmiUnsigned64 val = value;
412 ch = (unsigned char) val;
415 } while ((val != 0) || (ch & 0x80) != 0x00);
417 len += ber_len_length(len); /* length */
425 ber_len_val_oid(SmiType *smiType, len_type flags)
428 unsigned int oidlen = sizeof(oid)/sizeof(oid[0]);
434 for (i = 1; i < 128; i++) {
435 oid[i] = 4294967295UL;
439 /* see Aiko's measurements */
440 for (oidlen = 0; oidlen < 15; oidlen++) {
445 oid[0] = oid[1] = 0, oidlen = 2;
448 return ber_len_oid(oid, oidlen);
454 ber_len_val_octs(SmiType *smiType, len_type flags)
458 SmiModule *smiModule;
460 smiModule = smiGetTypeModule(smiType);
461 if (smiModule && smiModule->name && smiType->name) {
463 for (i = 0; specialTypes[i].module; i++) {
464 if (strcmp(specialTypes[i].module, smiModule->name) == 0
465 && (strcmp(specialTypes[i].name, smiType->name) == 0)) {
469 if (specialTypes[i].module) {
472 return specialTypes[i].max;
475 return specialTypes[i].mean;
478 return specialTypes[i].min;
486 len = smiGetMaxSize(smiType);
489 len = (smiGetMaxSize(smiType) + smiGetMinSize(smiType)) / 2;
492 len = smiGetMinSize(smiType);
501 ber_len_val_bits(SmiType *smiType, len_type flags)
507 len = smiGetMaxSize(smiType);
510 len = (smiGetMaxSize(smiType) + smiGetMinSize(smiType)) / 2;
513 len = smiGetMinSize(smiType);
522 ber_len_val_enum(SmiType *smiType, len_type flags)
524 SmiInteger32 val = 0;
528 val = getAbsMaxEnum(smiType);
531 val = (getAbsMaxEnum(smiType) + getAbsMinEnum(smiType)) / 2;
534 val = getAbsMinEnum(smiType);
537 return ber_len_int32(val);
543 ber_len_val_int32(SmiType *smiType, len_type flags)
545 SmiInteger32 val = 0;
549 val = getAbsMaxInteger32(smiType);
552 val = (getAbsMaxInteger32(smiType) + getAbsMinInteger32(smiType)) / 2;
555 val = getAbsMinInteger32(smiType);
558 return ber_len_int32(val);
564 ber_len_val_uint32(SmiType *smiType, len_type flags)
566 SmiUnsigned32 val = 0;
570 val = getMaxUnsigned32(smiType);
573 val = (getMaxUnsigned32(smiType) + getMinUnsigned32(smiType)) / 2;
576 val = getMinUnsigned32(smiType);
579 return ber_len_uint32(val);
585 ber_len_val_int64(SmiType *smiType, len_type flags)
587 SmiInteger64 val = 0;
591 val = getAbsMaxInteger64(smiType);
594 val = (getAbsMaxInteger64(smiType) + getAbsMinInteger64(smiType)) / 2;
597 val = getAbsMinInteger64(smiType);
600 return ber_len_int64(val);
606 ber_len_val_uint64(SmiType *smiType, len_type flags)
608 SmiUnsigned64 val = 0;
612 val = getMaxUnsigned64(smiType);
615 val = (getMaxUnsigned64(smiType) + getMinUnsigned64(smiType)) / 2;
618 val = getMinUnsigned64(smiType);
621 return ber_len_uint64(val);
627 ber_len_val(SmiType *smiType, len_type flags)
631 switch (smiType->basetype) {
632 case SMI_BASETYPE_OBJECTIDENTIFIER:
633 len = ber_len_val_oid(smiType, flags);
635 case SMI_BASETYPE_OCTETSTRING:
636 len = ber_len_val_octs(smiType, flags);
638 case SMI_BASETYPE_BITS:
639 len = ber_len_val_bits(smiType, flags);
641 case SMI_BASETYPE_ENUM:
642 len = ber_len_val_enum(smiType, flags);
644 case SMI_BASETYPE_INTEGER32:
645 len = ber_len_val_int32(smiType, flags);
647 case SMI_BASETYPE_UNSIGNED32:
648 len = ber_len_val_uint32(smiType, flags);
650 case SMI_BASETYPE_INTEGER64:
651 len = ber_len_val_int64(smiType, flags);
653 case SMI_BASETYPE_UNSIGNED64:
654 len = ber_len_val_uint64(smiType, flags);
666 append_index(SmiSubid *oid, unsigned int *oidlen,
667 SmiNode *indexNode, len_type flags)
669 SmiInteger32 int32 = 0;
670 SmiUnsigned32 uint32 = 0;
672 SmiModule *indexModule;
675 if (! indexNode) return;
677 indexType = smiGetNodeType(indexNode);
678 if (! indexType) return;
680 indexModule = smiGetTypeModule(indexType);
682 switch (indexType->basetype) {
683 case SMI_BASETYPE_OBJECTIDENTIFIER:
688 if (indexNode->implied) len--;
698 if (! indexNode->implied && *oidlen < 128) {
699 oid[(*oidlen)++] = len;
701 for (i = 0; i < len && *oidlen < 128; i++) {
705 oid[(*oidlen)++] = 2;
707 oid[(*oidlen)++] = 4294967295UL;
711 oid[(*oidlen)++] = i + 1;
714 oid[(*oidlen)++] = 0;
719 case SMI_BASETYPE_OCTETSTRING:
720 case SMI_BASETYPE_BITS:
723 len = smiGetMaxSize(indexType);
726 len = (smiGetMaxSize(indexType) + smiGetMinSize(indexType) / 2);
729 len = smiGetMinSize(indexType);
733 if (indexModule && indexModule->name && indexType->name) {
735 for (i = 0; specialTypes[i].module; i++) {
736 if (strcmp(specialTypes[i].module, indexModule->name) == 0
737 && (strcmp(specialTypes[i].name, indexType->name) == 0)) {
741 if (specialTypes[i].module) {
744 len = specialTypes[i].max;
747 len = specialTypes[i].mean;
750 len = specialTypes[i].min;
756 if (! indexNode->implied && *oidlen < 128) {
757 oid[(*oidlen)++] = len;
759 for (i = 0; i < len && *oidlen < 128; i++) {
762 oid[(*oidlen)++] = 255;
766 oid[(*oidlen)++] = 1;
768 oid[(*oidlen)++] = (i%2) ? 85 : 170;
772 oid[(*oidlen)++] = 0;
777 case SMI_BASETYPE_ENUM:
780 int32 = getAbsMaxEnum(indexType);
783 int32 = (getAbsMaxEnum(indexType) - getAbsMinEnum(indexType)) / 2;
786 int32 = getAbsMinEnum(indexType);
790 oid[(*oidlen)++] = int32;
793 case SMI_BASETYPE_INTEGER32:
796 int32 = getAbsMaxInteger32(indexType);
799 int32 = (getAbsMaxInteger32(indexType)
800 + getAbsMinInteger32(indexType)) / 2;
803 int32 = getAbsMinInteger32(indexType);
807 oid[(*oidlen)++] = int32;
810 case SMI_BASETYPE_UNSIGNED32:
813 uint32 = getMaxUnsigned32(indexType);
816 uint32 = (getMaxUnsigned32(indexType)
817 + getMinUnsigned32(indexType)) / 2;
820 uint32 = getMinUnsigned32(indexType);
824 oid[(*oidlen)++] = uint32;
827 case SMI_BASETYPE_UNKNOWN:
828 case SMI_BASETYPE_INTEGER64:
829 case SMI_BASETYPE_UNSIGNED64:
830 case SMI_BASETYPE_FLOAT32:
831 case SMI_BASETYPE_FLOAT64:
832 case SMI_BASETYPE_FLOAT128:
833 case SMI_BASETYPE_POINTER:
834 /* should never really get here */
842 ber_len_varbind(SmiNode *smiNode, len_type flags)
846 unsigned int oidlen = sizeof(oid)/sizeof(oid[0]);
852 switch (smiNode->nodekind) {
853 case SMI_NODEKIND_SCALAR:
854 for (oidlen = 0; oidlen < smiNode->oidlen; oidlen++) {
855 oid[oidlen] = smiNode->oid[oidlen];
859 case SMI_NODEKIND_COLUMN:
860 for (oidlen = 0; oidlen < smiNode->oidlen; oidlen++) {
861 oid[oidlen] = smiNode->oid[oidlen];
863 row = smiGetParentNode(smiNode);
865 SmiNode *indexNode = NULL, *iNode;
866 SmiElement *smiElement;
868 switch (row->indexkind) {
869 case SMI_INDEX_INDEX:
870 case SMI_INDEX_REORDER:
873 case SMI_INDEX_EXPAND: /* TODO: we have to do more work here! */
875 case SMI_INDEX_AUGMENT:
876 case SMI_INDEX_SPARSE:
877 indexNode = smiGetRelatedNode(row);
879 case SMI_INDEX_UNKNOWN:
883 for (smiElement = smiGetFirstElement(indexNode);
885 smiElement = smiGetNextElement(smiElement)) {
886 iNode = smiGetElementNode(smiElement);
887 append_index(oid, &oidlen, iNode, flags);
897 fprintf(stderr, "%-32s\t", smiNode->name);
898 for (x = 0; x < oidlen; x++) {
899 fprintf(stderr, ".%u", oid[x]);
901 fprintf(stderr, "\n");
904 len += ber_len_oid(oid, oidlen);
905 len += ber_len_val(smiGetNodeType(smiNode), flags);
906 len += ber_len_length(len) + 1;
914 isGroup(SmiNode *smiNode)
918 if (smiNode->nodekind == SMI_NODEKIND_ROW) {
922 for (childNode = smiGetFirstChildNode(smiNode);
924 childNode = smiGetNextChildNode(childNode)) {
925 if (childNode->nodekind == SMI_NODEKIND_SCALAR
926 && childNode->access > SMI_ACCESS_NOTIFY) {
937 dumpSizeOfPDU(FILE *f, SmiModule *smiModule, SmiNode *smiNode)
945 for (child = smiGetFirstChildNode(smiNode);
947 child = smiGetNextChildNode(child)) {
948 if (child->access == SMI_ACCESS_READ_WRITE
949 || child->access == SMI_ACCESS_READ_ONLY) {
951 b = ber_len_varbind(child, len_min);
952 a = ber_len_varbind(child, len_mean);
953 w = ber_len_varbind(child, len_max);
955 best += b, worst += w, avg += a, n++;
959 /* varbind list sequence length and tag */
960 best += ber_len_length(best) + 1;
961 avg += ber_len_length(avg) + 1;
962 worst += ber_len_length(worst) + 1;
964 /* request-id as defined in RFC 3416 */
965 best += ber_len_int32(0);
966 avg += ber_len_int32(1073741824);
967 worst += ber_len_int32(-214783648);
969 /* error-status as defined in RFC 3416 */
970 best += ber_len_int32(0);
971 avg += ber_len_int32(0);
972 worst += ber_len_int32(18);
974 /* error-index as defined in RFC 3416 */
975 best += ber_len_int32(0);
976 avg += ber_len_int32(0);
977 worst += ber_len_int32(n-1);
979 /* PDU sequence length and tag */
980 best += ber_len_length(best) + 1;
981 avg += ber_len_length(avg) + 1;
982 worst += ber_len_length(worst) + 1;
984 fprintf(f, "%-23s %-23s \t%d\t[%d..%d]\n", smiModule->name, smiNode->name,
988 for (child = smiGetFirstChildNode(smiNode);
990 child = smiGetNextChildNode(child)) {
991 if (child->access == SMI_ACCESS_READ_WRITE
992 || child->access == SMI_ACCESS_READ_ONLY) {
994 b = ber_len_varbind(child, len_min);
995 a = ber_len_varbind(child, len_mean);
996 w = ber_len_varbind(child, len_max);
998 fprintf(f, "%-23s %-23s \t%d\t[%d..%d]\n",
999 "", child->name, a, b, w);
1008 dumpSizeOfCreatePDU(FILE *f, SmiModule *smiModule, SmiNode *smiNode,
1009 int ignoreDefaultColumns)
1013 SmiModule *childTypeModule;
1021 for (child = smiGetFirstChildNode(smiNode);
1023 child = smiGetNextChildNode(child)) {
1024 if (child->access == SMI_ACCESS_READ_WRITE) {
1026 /* Ensure RowStatus columns are present even if they
1027 * have a default value. */
1029 childType = smiGetNodeType(child);
1030 childTypeModule = childType
1031 ? smiGetTypeModule(childType) : NULL;
1034 = (childType && childType->name
1035 && childTypeModule && childTypeModule->name)
1036 ? (strcmp(childType->name, "RowStatus") == 0
1037 && strcmp(childTypeModule->name, "SNMPv2-TC") == 0)
1040 /* xxx at least one PDU must be present xxx */
1042 if (ignoreDefaultColumns
1043 && child->value.basetype != SMI_BASETYPE_UNKNOWN
1048 b = ber_len_varbind(child, len_min);
1049 a = ber_len_varbind(child, len_mean);
1050 w = ber_len_varbind(child, len_max);
1053 fprintf(f, " %-32s\t[%d..%d] | %d\n", child->name, b, w, a);
1056 best += b, worst += w, avg += a, n++;
1060 /* varbind list sequence length and tag */
1061 best += ber_len_length(best) + 1;
1062 avg += ber_len_length(avg) + 1;
1063 worst += ber_len_length(worst) + 1;
1065 /* request-id as defined in RFC 3416 */
1066 best += ber_len_int32(0);
1067 avg += ber_len_int32(1073741824);
1068 worst += ber_len_int32(-214783648);
1070 /* error-status as defined in RFC 3416 */
1071 best += ber_len_int32(0);
1072 avg += ber_len_int32(0);
1073 worst += ber_len_int32(18);
1075 /* error-index as defined in RFC 3416 */
1076 best += ber_len_int32(0);
1077 avg += ber_len_int32(0);
1078 worst += ber_len_int32(n-1);
1080 /* PDU sequence length and tag */
1081 best += ber_len_length(best) + 1;
1082 avg += ber_len_length(avg) + 1;
1083 worst += ber_len_length(worst) + 1;
1085 fprintf(f, "%-23s %-23s \t%d\t[%d..%d]\n", smiModule->name, smiNode->name,
1092 dumpSizeOfNotificationPDU(FILE *f, SmiModule *smiModule, SmiNode *smiNode)
1094 SmiElement *smiElement;
1101 static const SmiSubid snmpTrapOid0[]
1102 = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1, 0 };
1103 static const int snmpTrapOid0Len
1104 = sizeof(snmpTrapOid0) / sizeof(SmiSubid);
1106 b = 15, w = 19, a = 18;
1107 best += b, worst += w, avg += a;
1109 len += ber_len_oid(smiNode->oid, smiNode->oidlen);
1110 len += ber_len_oid(snmpTrapOid0, snmpTrapOid0Len);
1111 len += ber_len_length(len) + 1;
1112 b = len, w = len, a = len;
1113 best += b, worst += w, avg += a;
1115 for (smiElement = smiGetFirstElement(smiNode);
1117 smiElement = smiGetNextElement(smiElement)) {
1118 varNode = smiGetElementNode(smiElement);
1119 if (! varNode) continue;
1121 b = ber_len_varbind(varNode, len_min);
1122 a = ber_len_varbind(varNode, len_mean);
1123 w = ber_len_varbind(varNode, len_max);
1125 best += b, worst += w, avg += a;
1128 /* varbind list sequence length and tag */
1129 best += ber_len_length(best) + 1;
1130 avg += ber_len_length(avg) + 1;
1131 worst += ber_len_length(worst) + 1;
1133 /* request-id as defined in RFC 3416 */
1134 best += ber_len_int32(0);
1135 avg += ber_len_int32(1073741824);
1136 worst += ber_len_int32(-214783648);
1138 /* error-status as defined in RFC 3416 */
1139 best += ber_len_int32(0);
1140 avg += ber_len_int32(0);
1141 worst += ber_len_int32(18);
1143 /* error-index as defined in RFC 3416 */
1144 best += ber_len_int32(0);
1145 avg += ber_len_int32(0);
1146 worst += ber_len_int32(0);
1148 /* PDU sequence length and tag */
1149 best += ber_len_length(best) + 1;
1150 avg += ber_len_length(avg) + 1;
1151 worst += ber_len_length(worst) + 1;
1153 fprintf(f, "%-23s %-23s \t%d\t[%d..%d]\n", smiModule->name, smiNode->name,
1157 b = 15, w = 19, a = 18;
1158 fprintf(f, "%-23s %-23s \t%d\t[%d..%d]\n",
1159 "", "sysUpTime", a, b, w);
1162 len += ber_len_oid(smiNode->oid, smiNode->oidlen);
1163 len += ber_len_oid(snmpTrapOid0, snmpTrapOid0Len);
1164 len += ber_len_length(len) + 1;
1165 b = len, w = len, a = len;
1166 fprintf(f, "%-23s %-23s \t%d\t[%d..%d]\n",
1167 "", "snmpTrapOID", a, b, w);
1169 for (smiElement = smiGetFirstElement(smiNode);
1171 smiElement = smiGetNextElement(smiElement)) {
1172 varNode = smiGetElementNode(smiElement);
1173 if (! varNode) continue;
1175 b = ber_len_varbind(varNode, len_min);
1176 a = ber_len_varbind(varNode, len_mean);
1177 w = ber_len_varbind(varNode, len_max);
1179 fprintf(f, "%-23s %-23s \t%d\t[%d..%d]\n",
1180 "", varNode->name, a, b, w);
1188 dumpGroupPduSizes(FILE *f, SmiModule *smiModule)
1192 for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ANY);
1194 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ANY)) {
1195 if (isGroup(smiNode)) {
1196 dumpSizeOfPDU(f, smiModule, smiNode);
1204 dumpFullRowCreatePduSizes(FILE *f, SmiModule *smiModule)
1208 for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ROW);
1210 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ROW)) {
1211 if (smiNode->create) {
1212 dumpSizeOfCreatePDU(f, smiModule, smiNode, 0);
1220 dumpSmallRowCreatePduSizes(FILE *f, SmiModule *smiModule)
1224 for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_ROW);
1226 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_ROW)) {
1227 if (smiNode->create) {
1228 dumpSizeOfCreatePDU(f, smiModule, smiNode, 1);
1236 dumpNotificationPduSizes(FILE *f, SmiModule *smiModule)
1240 for (smiNode = smiGetFirstNode(smiModule, SMI_NODEKIND_NOTIFICATION);
1242 smiNode = smiGetNextNode(smiNode, SMI_NODEKIND_NOTIFICATION)) {
1243 dumpSizeOfNotificationPDU(f, smiModule, smiNode);
1250 dumpSizes(int modc, SmiModule **modv, int flags, char *output)
1255 silent = (flags & SMIDUMP_FLAG_SILENT);
1258 f = fopen(output, "w");
1260 fprintf(stderr, "smidump: cannot open %s for writing: ", output);
1266 if (flags & SMIDUMP_FLAG_UNITE) {
1269 fprintf(f, "# united module PDU sizes (generated by smidump "
1270 SMI_VERSION_STRING ")\n");
1271 fprintf(f, "#\n# smidump -u -f sizes");
1272 for (i = 0; i < modc; i++) {
1273 int len = strlen(modv[i]->name);
1274 if (pos + len > 70) {
1275 fprintf(f, " \\\n#\t"), pos = 8;
1277 fprintf(f, "%s ", modv[i]->name);
1280 fprintf(f, "%s\n", (pos == 8) ? "" : "\n");
1282 fprintf(f, "\n# size of PDUs for groups and rows:\n\n");
1283 for (i = 0; i < modc; i++) {
1284 dumpGroupPduSizes(f, modv[i]);
1286 fprintf(f, "\n# size of one-shot row creation PDUs including columns with default values:\n\n");
1287 for (i = 0; i < modc; i++) {
1288 dumpFullRowCreatePduSizes(f, modv[i]);
1290 fprintf(f, "\n# size of one-shot row creation PDUs excluding columns with default values:\n\n");
1291 for (i = 0; i < modc; i++) {
1292 dumpSmallRowCreatePduSizes(f, modv[i]);
1294 fprintf(f, "\n# size of notification PDUs:\n\n");
1295 for (i = 0; i < modc; i++) {
1296 dumpNotificationPduSizes(f, modv[i]);
1299 for (i = 0; i < modc; i++) {
1301 fprintf(f, "# %s module PDU sizes (generated by smidump "
1302 SMI_VERSION_STRING ")\n\n", modv[i]->name);
1304 fprintf(f, "\n# size of PDUs for groups and rows:\n\n");
1305 dumpGroupPduSizes(f, modv[i]);
1306 fprintf(f, "\n# size of one-shot row creation PDUs including columns with default values:\n\n");
1307 dumpFullRowCreatePduSizes(f, modv[i]);
1308 fprintf(f, "\n# size of one-shot row creation PDUs excluding columns with default values:\n\n");
1309 dumpSmallRowCreatePduSizes(f, modv[i]);
1310 fprintf(f, "\n# size of notification PDUs:\n\n");
1311 dumpNotificationPduSizes(f, modv[i]);
1315 if (fflush(f) || ferror(f)) {
1316 perror("smidump: write error");
1328 static SmidumpDriverOption opt[] = {
1329 { "variables", OPT_FLAG, &detail, 0,
1330 "show detailed information the sizes of variables"},
1331 { 0, OPT_END, 0, 0 }
1334 static SmidumpDriver driver = {
1339 "RFC 3416 PDU sizes excluding message / transport headers",
1344 smidumpRegisterDriver(&driver);