I think, we have a problem in this code, Correct me, if I wrong
case TIME_EXCEEDED_TYPE:
if (code >= TIME_TO_LIVE || code < TIME_EXCEEDED_UNKNOWN) // << I think this is a mistake
err << TIME_EXCEEDED_CODE[code];
else
err << TIME_EXCEEDED_CODE[TIME_EXCEEDED_UNKNOWN];
break;
TIME_TO_LIVE = 0
TIME_EXCEEDED_UNKNOWN = 2