package freenet.io.comm; /** * Represents the Traffic Class as set in @see Socket.setTrafficClass(int) * @see https://en.wikipedia.org/wiki/Differentiated_services */ public enum TrafficClass { BEST_EFFORT(0), DSCP_CRITICAL(0xB8), DSCP_AF11(0x28), DSCP_AF12(0x30), DSCP_AF13(0x38), DSCP_AF21(0x48), DSCP_AF22(0x50), DSCP_AF23(0x52), DSCP_AF31(0x58), DSCP_AF32(0x70), DSCP_AF33(0x78), DSCP_AF41(0x88), DSCP_AF42(0x90), DSCP_AF43(0x98), DSCP_CS0(0), DSCP_CS1(0x20), DSCP_CS2(0x40), DSCP_CS3(0x60), DSCP_CS4(0x80), DSCP_CS5(0xA0), DSCP_CS6(0xC0), DSCP_CS7(0xE0), RFC1349_IPTOS_LOWCOST(0x02), RFC1349_IPTOS_RELIABILITY(0x04), RFC1349_IPTOS_THROUGHPUT(0x08), RFC1349_IPTOS_LOWDELAY(0x10); public final int value; TrafficClass(int tc) { value = tc; } public static TrafficClass getDefault() { // That's high-throughput, high drop probability return TrafficClass.DSCP_CS1; } public static TrafficClass fromNameOrValue(String tcName) { int tcParsed = -1; try { tcParsed = Integer.parseInt(tcName); } catch (NumberFormatException e){ // it's fine; we might have a name here } for (TrafficClass t : TrafficClass.values()) { if (t.toString().equalsIgnoreCase(tcName) || t.value == tcParsed) { return t; } } throw new IllegalArgumentException(); } }