com.barchart.udt.OptionUDT Maven / Gradle / Ivy
The newest version!
/**
* Copyright (C) 2009-2013 Barchart, Inc.
*
* All rights reserved. Licensed under the OSI BSD License.
*
* http://www.opensource.org/licenses/bsd-license.php
*/
package com.barchart.udt;
import static com.barchart.udt.OptionUDT.Format.*;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.barchart.udt.util.HelpUDT;
/**
* The Enum OptionUDT.
*
* provide 2 names: 1) UDT original and 2) human-readble
*
* keep code values in sync with udt.h - UDT::UDTOpt; enum starts with index 0
*
* @see udt options
*
* UDT_MSS, // the Maximum Transfer Unit
* UDT_SNDSYN, // if sending is blocking
* UDT_RCVSYN, // if receiving is blocking
* UDT_CC, // custom congestion control algorithm
* UDT_FC, // Flight flag size (window size)
* UDT_SNDBUF, // maximum buffer in sending queue
* UDT_RCVBUF, // UDT receiving buffer size
* UDT_LINGER, // waiting for unsent data when closing
* UDP_SNDBUF, // UDP sending buffer size
* UDP_RCVBUF, // UDP receiving buffer size
* UDT_MAXMSG, // maximum datagram message size
* UDT_MSGTTL, // time-to-live of a datagram message
* UDT_RENDEZVOUS, // rendezvous connection mode
* UDT_SNDTIMEO, // send() timeout
* UDT_RCVTIMEO, // recv() timeout
* UDT_REUSEADDR, // reuse an existing port or create a new one
* UDT_MAXBW, // maximum bandwidth (bytes per second) that the connection can use
* UDT_STATE, // current socket state, see UDTSTATUS, read only
* UDT_EVENT, // current avalable events associated with the socket
* UDT_SNDDATA, // size of data in the sending buffer
* UDT_RCVDATA // size of data available for recv
*
*/
public class OptionUDT {
static {
log = LoggerFactory.getLogger(OptionUDT.class);
values = new CopyOnWriteArrayList>();
}
/** the Maximum Transfer Unit. */
public static final OptionUDT UDT_MSS = //
NEW(0, Integer.class, DECIMAL);
/** the Maximum Transfer Unit., bytes */
public static final OptionUDT Maximum_Transfer_Unit = //
NEW(0, Integer.class, DECIMAL);
/** if sending is blocking. */
public static final OptionUDT UDT_SNDSYN = //
NEW(1, Boolean.class, BOOLEAN);
/** if sending is blocking., true/false */
public static final OptionUDT Is_Send_Synchronous = //
NEW(1, Boolean.class, BOOLEAN);
/** if receiving is blocking. */
public static final OptionUDT UDT_RCVSYN = //
NEW(2, Boolean.class, BOOLEAN);
/** if receiving is blocking, true/false */
public static final OptionUDT Is_Receive_Synchronous = //
NEW(2, Boolean.class, BOOLEAN);
/** custom congestion control algorithm */
@SuppressWarnings("rawtypes")
public static final OptionUDT UDT_CC = //
NEW(3, FactoryUDT.class, DEFAULT);
/** custom congestion control algorithm, class factory */
@SuppressWarnings("rawtypes")
public static final OptionUDT Custom_Congestion_Control = //
NEW(3, FactoryUDT.class, DEFAULT);
/** Flight flag size (window size). */
public static final OptionUDT UDT_FC = //
NEW(4, Integer.class, BINARY);
/** Flight flag size (window size), bytes */
public static final OptionUDT Flight_Window_Size = //
NEW(4, Integer.class, BINARY);
/** maximum buffer in sending queue. */
public static final OptionUDT UDT_SNDBUF = //
NEW(5, Integer.class, DECIMAL);
/** maximum buffer in sending queue. */
public static final OptionUDT Protocol_Send_Buffer_Size = //
NEW(5, Integer.class, DECIMAL);
/** UDT receiving buffer size. */
public static final OptionUDT UDT_RCVBUF = //
NEW(6, Integer.class, DECIMAL);
/** UDT receiving buffer size limit, bytes */
public static final OptionUDT Protocol_Receive_Buffer_Size = //
NEW(6, Integer.class, DECIMAL);
/** waiting for unsent data when closing. */
public static final OptionUDT UDT_LINGER = //
NEW(7, LingerUDT.class, DECIMAL);
/** waiting for unsent data when closing. true/false and timeout, seconds */
public static final OptionUDT Time_To_Linger_On_Close = //
NEW(7, LingerUDT.class, DECIMAL);
/** UDP sending buffer size. */
public static final OptionUDT UDP_SNDBUF = //
NEW(8, Integer.class, DECIMAL);
/** UDP sending buffer size limit, bytes */
public static final OptionUDT System_Send_Buffer_Size = //
NEW(8, Integer.class, DECIMAL);
/** UDP receiving buffer size. */
public static final OptionUDT UDP_RCVBUF = //
NEW(9, Integer.class, DECIMAL);
/** UDP receiving buffer size limit, bytes */
public static final OptionUDT System_Receive_Buffer_Size = //
NEW(9, Integer.class, DECIMAL);
/* maximum datagram message size */
// UDT_MAXMSG(10, Integer.class, DECIMAL); no support in udt core
/* time-to-live of a datagram message */
// UDT_MSGTTL(11, Integer.class, DECIMAL); no support in udt core
/** rendezvous connection mode. */
public static final OptionUDT UDT_RENDEZVOUS = //
NEW(12, Boolean.class, BOOLEAN);
/** rendezvous connection mode, enabled/disabled */
public static final OptionUDT Is_Randezvous_Connect_Enabled = //
NEW(12, Boolean.class, BOOLEAN);
/** send() timeout. */
public static final OptionUDT UDT_SNDTIMEO = //
NEW(13, Integer.class, DECIMAL);
/** send() timeout. milliseconds */
public static final OptionUDT Send_Timeout = //
NEW(13, Integer.class, DECIMAL);
/** recv() timeout. */
public static final OptionUDT UDT_RCVTIMEO = //
NEW(14, Integer.class, DECIMAL);
/** recv() timeout. milliseconds */
public static final OptionUDT Receive_Timeout = //
NEW(14, Integer.class, DECIMAL);
/** reuse an existing port or create a one. */
public static final OptionUDT UDT_REUSEADDR = //
NEW(15, Boolean.class, BOOLEAN);
/** reuse an existing port or create a one. true/false */
public static final OptionUDT Is_Address_Reuse_Enabled = //
NEW(15, Boolean.class, BOOLEAN);
/** maximum bandwidth (bytes per second) that the connection can use. */
public static final OptionUDT UDT_MAXBW = //
NEW(16, Long.class, DECIMAL);
/** maximum bandwidth (bytes per second) that the connection can use. */
public static final OptionUDT Maximum_Bandwidth = //
NEW(16, Long.class, DECIMAL);
/** current socket state, see UDTSTATUS, read only */
public static final OptionUDT UDT_STATE = //
NEW(17, Integer.class, DECIMAL);
/** current socket status code, see {@link StatusUDT#getCode()}, read only */
public static final OptionUDT Status_Code = //
NEW(17, Integer.class, DECIMAL);
/** current available events associated with the socket */
public static final OptionUDT UDT_EVENT = //
NEW(18, Integer.class, DECIMAL);
/** current available epoll events, see {@link EpollUDT.Opt#code} */
public static final OptionUDT Epoll_Event_Mask = //
NEW(18, Integer.class, DECIMAL);
/** size of data in the sending buffer */
public static final OptionUDT UDT_SNDDATA = //
NEW(19, Integer.class, DECIMAL);
/** current consumed sending buffer utilization, read only, bytes */
public static final OptionUDT Send_Buffer_Consumed = //
NEW(19, Integer.class, DECIMAL);
/** size of data available for recv */
public static final OptionUDT UDT_RCVDATA = //
NEW(20, Integer.class, DECIMAL);
/** current available receiving buffer capacity, read only, bytes */
public static final OptionUDT Receive_Buffer_Available = //
NEW(20, Integer.class, DECIMAL);
//
protected OptionUDT(final int code, final Class klaz, final Format format) {
this.code = code;
this.type = klaz;
this.format = format;
values.add(this);
}
protected static OptionUDT NEW(final int code, final Class klaz,
final Format format) {
return new OptionUDT(code, klaz, format);
}
public static void appendSnapshot( //
final SocketUDT socketUDT, //
final StringBuilder text //
) {
text.append("\n\t");
text.append(String.format("[id: 0x%08x]", socketUDT.id()));
for (final OptionUDT> option : values) {
int optionCode = 0;
String optionName = null;
String optionValue = null;
try {
optionCode = option.code;
optionName = option.name();
optionValue = option.format.convert(//
socketUDT.getOption(option));
if (optionName.startsWith("UD")) {
continue;
}
text.append("\n\t");
text.append(optionCode);
text.append(") ");
text.append(optionName);
text.append(" = ");
text.append(optionValue);
} catch (final Exception e) {
log.error("unexpected; " + optionName, e);
}
}
}
protected static final Logger log;
protected static final List> values;
private final int code;
private final Class> type;
private final Format format;
private String name;
public int code() {
return code;
}
public Class> type() {
return type;
}
public Format format() {
return format;
}
public String name() {
if (name == null) {
name = HelpUDT.constantFieldName(getClass(), this);
}
return name;
}
/**
* render options in human format
*/
public enum Format {
DECIMAL() {
@Override
public String convert(final Object value) {
if (value instanceof Number) {
final long number = ((Number) value).longValue();
return String.format("%,d", number);
}
return "invalid format";
}
}, //
BINARY() {
@Override
public String convert(final Object value) {
if (value instanceof Number) {
final long number = ((Number) value).longValue();
return String.format("%,d (%,d K)", number, number / 1024);
}
return "invalid format";
}
}, //
BOOLEAN() {
@Override
public String convert(final Object value) {
if (value instanceof Boolean) {
final boolean bool = ((Boolean) value).booleanValue();
return String.format("%b", bool);
}
return "invalid format";
}
}, //
DEFAULT() {
@Override
public String convert(final Object value) {
return "" + value;
}
}, //
;
public abstract String convert(Object value);
}
}