2016-05-11 4 views
3

У меня вопрос: с помощью новых libs (loom, ofs_handler, of_driver) Мне нужно отправить сообщение настроек для переключения. я должен создать запись так:Как правильно преобразовать целое число в bitstring?

-record(ofp_field, { 
      class = openflow_basic :: ofp_field_class(), 
      name :: ofp_field_type(), 
      has_mask = false :: boolean(), 
      value :: bitstring(), 
      mask :: bitstring() 
     }). 

Но «значения» должна быть битовым, и я не знаю, как правильно преобразовать номер порта (например, 8080, 6633) в битовую строку, потому что я может сделать <<Port>>, <<Port:32/integer>> и получить разные результаты. Есть ли у кого-нибудь идея, как сделать это правильно?
Или мне нужно использовать binary:encode_unsigned?

ответ

5

В протоколе OpenFlow номера портов TCP и UDP представлены в виде 16-разрядных целых чисел (см. Таблицу 12 в спецификации 1.4.0). Таким образом, вы должны написать <<Port:16>>.

OpenFlow использует целые числа большого числа (то есть сетевой байтовый порядок) во всем, что и генерирует Erlang, если вы не укажете другую консистенцию, чтобы код работал правильно на любой платформе. (В C вам придется конвертировать между хостом и сетевым порядком байтов.) См. "Bit Syntax Expressions in the Erlang Reference Manual" о том, как использовать различную endianness, если вам нужно это для другого протокола.

+0

спасибо, что ответит, но что это будет не порт? Я в софию. –

+0

тип openflow_basic_type() :: in_port | in_phy_port | метаданные | eth_dst | eth_src | eth_type | vlan_vid | vlan_pcp | ip_dscp | ip_ecn | ip_proto | ipv4_src | ipv4_dst | tcp_src | tcp_dst | udp_src | udp_dst | sctp_src | sctp_dst | ... –

+0

Один из 'tcp_src',' tcp_dst', 'udp_src' или' udp_dst', в зависимости от того, является ли протокол TCP или UDP, и является ли он исходным или конечным портом. – legoscia