int cpacketsize = 64; /* default packet size */
int bitpattern = 0;
int tos = 0;
+#ifdef SO_MARK
+int mark = -1;
+#endif
int reportwide = 0;
int af = DEFAULT_AF;
int mtrtype = IPPROTO_ICMP; /* Use ICMP as default packet type */
#ifdef IPINFO
{ "ipinfo", 1, 0, 'y' }, /* IP info lookup */
{ "aslookup", 0, 0, 'z' }, /* Do AS lookup (--ipinfo 0) */
+#endif
+#ifdef SO_MARK
+ { "mark", 1, 0, 'M' }, /* use SO_MARK */
#endif
{ 0, 0, 0, 0 }
};
case 'z':
fprintf( stderr, "IPINFO not enabled.\n" );
break;
+#endif
+#ifdef SO_MARK
+ case 'M':
+ mark = atoi (optarg);
+ if (mark < 0) {
+ fprintf( stderr, "SO_MARK must be positive.\n" );
+ exit(EXIT_FAILURE);
+ }
+ break;
#endif
}
}
#ifdef IPINFO
"\t\t[--ipinfo=item_no|-y item_no]\n"
"\t\t[--aslookup|-z]\n"
+#endif
+#ifdef SO_MARK
+ "\t\t[--mark=NUM]\n"
#endif
"\t\t[--psize=bytes/-s bytes] [--order fields]\n" /* ok */
"\t\t[--report-wide|-w] [--inet] [--inet6] [--max-ttl=NUM] [--first-ttl=NUM]\n"
extern int mtrtype; /* type of query packet used */
extern int remoteport; /* target port for TCP tracing */
extern int timeout; /* timeout for TCP connections */
+#ifdef SO_MARK
+extern int mark; /* SO_MARK to set for ping packet*/
+#endif
/* return the number of microseconds to wait before sending the next
ping */
#endif
}
+#ifdef SO_MARK
+ if (mark >= 0 && setsockopt( s, SOL_SOCKET, SO_MARK, &mark, sizeof mark ) ) {
+ perror( "setsockopt SO_MARK" );
+ exit( EXIT_FAILURE );
+ }
+#endif
+
switch (local.ss_family) {
case AF_INET:
port = ntohs(local4->sin_port);
#endif
}
+#ifdef SO_MARK
+ if (mark >= 0 && setsockopt( sendsock, SOL_SOCKET, SO_MARK, &mark, sizeof mark ) ) {
+ perror( "setsockopt SO_MARK" );
+ exit( EXIT_FAILURE );
+ }
+#endif
+
switch ( mtrtype ) {
case IPPROTO_ICMP:
icmp = (struct ICMPHeader *)(packet + iphsize);