Blame msg.h

Packit Service d8d8ac
/**
Packit Service d8d8ac
 * @file msg.h
Packit Service d8d8ac
 * @brief Implements the various PTP message types.
Packit Service d8d8ac
 * @note Copyright (C) 2011 Richard Cochran <richardcochran@gmail.com>
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This program is free software; you can redistribute it and/or modify
Packit Service d8d8ac
 * it under the terms of the GNU General Public License as published by
Packit Service d8d8ac
 * the Free Software Foundation; either version 2 of the License, or
Packit Service d8d8ac
 * (at your option) any later version.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This program is distributed in the hope that it will be useful,
Packit Service d8d8ac
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service d8d8ac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service d8d8ac
 * GNU General Public License for more details.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * You should have received a copy of the GNU General Public License along
Packit Service d8d8ac
 * with this program; if not, write to the Free Software Foundation, Inc.,
Packit Service d8d8ac
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Packit Service d8d8ac
 */
Packit Service d8d8ac
#ifndef HAVE_MSG_H
Packit Service d8d8ac
#define HAVE_MSG_H
Packit Service d8d8ac
Packit Service d8d8ac
#include <stdio.h>
Packit Service d8d8ac
#include <sys/queue.h>
Packit Service d8d8ac
#include <time.h>
Packit Service d8d8ac
#include <asm/byteorder.h>
Packit Service d8d8ac
Packit Service d8d8ac
#include "address.h"
Packit Service d8d8ac
#include "ddt.h"
Packit Service d8d8ac
#include "tlv.h"
Packit Service d8d8ac
#include "tmv.h"
Packit Service d8d8ac
Packit Service d8d8ac
#define PTP_VERSION 2
Packit Service d8d8ac
Packit Service d8d8ac
/* Values for the messageType field */
Packit Service d8d8ac
#define SYNC                  0x0
Packit Service d8d8ac
#define DELAY_REQ             0x1
Packit Service d8d8ac
#define PDELAY_REQ            0x2
Packit Service d8d8ac
#define PDELAY_RESP           0x3
Packit Service d8d8ac
#define FOLLOW_UP             0x8
Packit Service d8d8ac
#define DELAY_RESP            0x9
Packit Service d8d8ac
#define PDELAY_RESP_FOLLOW_UP 0xA
Packit Service d8d8ac
#define ANNOUNCE              0xB
Packit Service d8d8ac
#define SIGNALING             0xC
Packit Service d8d8ac
#define MANAGEMENT            0xD
Packit Service d8d8ac
Packit Service d8d8ac
/* Bits for flagField[0] */
Packit Service d8d8ac
#define ALT_MASTER     (1<<0)
Packit Service d8d8ac
#define TWO_STEP       (1<<1)
Packit Service d8d8ac
#define UNICAST        (1<<2)
Packit Service d8d8ac
Packit Service d8d8ac
/* Bits for flagField[1] */
Packit Service d8d8ac
#define LEAP_61        (1<<0)
Packit Service d8d8ac
#define LEAP_59        (1<<1)
Packit Service d8d8ac
#define UTC_OFF_VALID  (1<<2)
Packit Service d8d8ac
#define PTP_TIMESCALE  (1<<3)
Packit Service d8d8ac
#define TIME_TRACEABLE (1<<4)
Packit Service d8d8ac
#define FREQ_TRACEABLE (1<<5)
Packit Service d8d8ac
Packit Service d8d8ac
enum timestamp_type {
Packit Service d8d8ac
	TS_SOFTWARE,
Packit Service d8d8ac
	TS_HARDWARE,
Packit Service d8d8ac
	TS_LEGACY_HW,
Packit Service d8d8ac
	TS_ONESTEP,
Packit Service d8d8ac
	TS_P2P1STEP,
Packit Service d8d8ac
};
Packit Service d8d8ac
Packit Service d8d8ac
struct hw_timestamp {
Packit Service d8d8ac
	enum timestamp_type type;
Packit Service d8d8ac
	tmv_t ts;
Packit Service d8d8ac
	tmv_t sw;
Packit Service d8d8ac
};
Packit Service d8d8ac
Packit Service d8d8ac
enum controlField {
Packit Service d8d8ac
	CTL_SYNC,
Packit Service d8d8ac
	CTL_DELAY_REQ,
Packit Service d8d8ac
	CTL_FOLLOW_UP,
Packit Service d8d8ac
	CTL_DELAY_RESP,
Packit Service d8d8ac
	CTL_MANAGEMENT,
Packit Service d8d8ac
	CTL_OTHER,
Packit Service d8d8ac
};
Packit Service d8d8ac
Packit Service d8d8ac
struct ptp_header {
Packit Service d8d8ac
	uint8_t             tsmt; /* transportSpecific | messageType */
Packit Service d8d8ac
	uint8_t             ver;  /* reserved          | versionPTP  */
Packit Service d8d8ac
	UInteger16          messageLength;
Packit Service d8d8ac
	UInteger8           domainNumber;
Packit Service d8d8ac
	Octet               reserved1;
Packit Service d8d8ac
	Octet               flagField[2];
Packit Service d8d8ac
	Integer64           correction;
Packit Service d8d8ac
	UInteger32          reserved2;
Packit Service d8d8ac
	struct PortIdentity sourcePortIdentity;
Packit Service d8d8ac
	UInteger16          sequenceId;
Packit Service d8d8ac
	UInteger8           control;
Packit Service d8d8ac
	Integer8            logMessageInterval;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct announce_msg {
Packit Service d8d8ac
	struct ptp_header    hdr;
Packit Service d8d8ac
	struct Timestamp     originTimestamp;
Packit Service d8d8ac
	Integer16            currentUtcOffset;
Packit Service d8d8ac
	Octet                reserved;
Packit Service d8d8ac
	UInteger8            grandmasterPriority1;
Packit Service d8d8ac
	struct ClockQuality  grandmasterClockQuality;
Packit Service d8d8ac
	UInteger8            grandmasterPriority2;
Packit Service d8d8ac
	struct ClockIdentity grandmasterIdentity;
Packit Service d8d8ac
	UInteger16           stepsRemoved;
Packit Service d8d8ac
	Enumeration8         timeSource;
Packit Service d8d8ac
	uint8_t              suffix[0];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct sync_msg {
Packit Service d8d8ac
	struct ptp_header   hdr;
Packit Service d8d8ac
	struct Timestamp    originTimestamp;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct delay_req_msg {
Packit Service d8d8ac
	struct ptp_header   hdr;
Packit Service d8d8ac
	struct Timestamp    originTimestamp;
Packit Service d8d8ac
	uint8_t             suffix[0];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct follow_up_msg {
Packit Service d8d8ac
	struct ptp_header   hdr;
Packit Service d8d8ac
	struct Timestamp    preciseOriginTimestamp;
Packit Service d8d8ac
	uint8_t             suffix[0];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct delay_resp_msg {
Packit Service d8d8ac
	struct ptp_header   hdr;
Packit Service d8d8ac
	struct Timestamp    receiveTimestamp;
Packit Service d8d8ac
	struct PortIdentity requestingPortIdentity;
Packit Service d8d8ac
	uint8_t             suffix[0];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct pdelay_req_msg {
Packit Service d8d8ac
	struct ptp_header   hdr;
Packit Service d8d8ac
	struct Timestamp    originTimestamp;
Packit Service d8d8ac
	struct PortIdentity reserved;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct pdelay_resp_msg {
Packit Service d8d8ac
	struct ptp_header   hdr;
Packit Service d8d8ac
	struct Timestamp    requestReceiptTimestamp;
Packit Service d8d8ac
	struct PortIdentity requestingPortIdentity;
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct pdelay_resp_fup_msg {
Packit Service d8d8ac
	struct ptp_header   hdr;
Packit Service d8d8ac
	struct Timestamp    responseOriginTimestamp;
Packit Service d8d8ac
	struct PortIdentity requestingPortIdentity;
Packit Service d8d8ac
	uint8_t             suffix[0];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct signaling_msg {
Packit Service d8d8ac
	struct ptp_header   hdr;
Packit Service d8d8ac
	struct PortIdentity targetPortIdentity;
Packit Service d8d8ac
	uint8_t             suffix[0];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct management_msg {
Packit Service d8d8ac
	struct ptp_header   hdr;
Packit Service d8d8ac
	struct PortIdentity targetPortIdentity;
Packit Service d8d8ac
	UInteger8           startingBoundaryHops;
Packit Service d8d8ac
	UInteger8           boundaryHops;
Packit Service d8d8ac
	uint8_t             flags; /* reserved | actionField */
Packit Service d8d8ac
	uint8_t             reserved;
Packit Service d8d8ac
	uint8_t             suffix[0];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct message_data {
Packit Service d8d8ac
	uint8_t buffer[1500];
Packit Service d8d8ac
} PACKED;
Packit Service d8d8ac
Packit Service d8d8ac
struct ptp_message {
Packit Service d8d8ac
	union {
Packit Service d8d8ac
		struct ptp_header          header;
Packit Service d8d8ac
		struct announce_msg        announce;
Packit Service d8d8ac
		struct sync_msg            sync;
Packit Service d8d8ac
		struct delay_req_msg       delay_req;
Packit Service d8d8ac
		struct follow_up_msg       follow_up;
Packit Service d8d8ac
		struct delay_resp_msg      delay_resp;
Packit Service d8d8ac
		struct pdelay_req_msg      pdelay_req;
Packit Service d8d8ac
		struct pdelay_resp_msg     pdelay_resp;
Packit Service d8d8ac
		struct pdelay_resp_fup_msg pdelay_resp_fup;
Packit Service d8d8ac
		struct signaling_msg       signaling;
Packit Service d8d8ac
		struct management_msg      management;
Packit Service d8d8ac
		struct message_data        data;
Packit Service d8d8ac
	} PACKED;
Packit Service d8d8ac
	/**/
Packit Service d8d8ac
	int tail_room;
Packit Service d8d8ac
	int refcnt;
Packit Service d8d8ac
	TAILQ_ENTRY(ptp_message) list;
Packit Service d8d8ac
	struct {
Packit Service d8d8ac
		/**
Packit Service d8d8ac
		 * Contains the time stamp from the packet data in a
Packit Service d8d8ac
		 * native binary format for the host machine. The
Packit Service d8d8ac
		 * exact source of the time stamp's value depends on
Packit Service d8d8ac
		 * the message type:
Packit Service d8d8ac
		 *
Packit Service d8d8ac
		 * - announce    originTimestamp
Packit Service d8d8ac
		 * - follow_up   preciseOriginTimestamp
Packit Service d8d8ac
		 * - sync        originTimestamp
Packit Service d8d8ac
		 * - delay_req   originTimestamp
Packit Service d8d8ac
		 * - pdelay_resp     requestReceiptTimestamp
Packit Service d8d8ac
		 * - pdelay_resp_fup responseOriginTimestamp
Packit Service d8d8ac
		 */
Packit Service d8d8ac
		struct timestamp pdu;
Packit Service d8d8ac
		/**
Packit Service d8d8ac
		 * Approximate ingress time stamp using the relative
Packit Service d8d8ac
		 * CLOCK_MONOTONIC. Used to determine when announce
Packit Service d8d8ac
		 * messages have expired.
Packit Service d8d8ac
		 */
Packit Service d8d8ac
		struct timespec host;
Packit Service d8d8ac
	} ts;
Packit Service d8d8ac
	/**
Packit Service d8d8ac
	 * Contains the ingress time stamp obtained by the
Packit Service d8d8ac
	 * SO_TIMESTAMPING socket option.
Packit Service d8d8ac
	 */
Packit Service d8d8ac
	struct hw_timestamp hwts;
Packit Service d8d8ac
	/**
Packit Service d8d8ac
	 * Contains the address this message was received from or should be
Packit Service d8d8ac
	 * sent to.
Packit Service d8d8ac
	 */
Packit Service d8d8ac
	struct address address;
Packit Service d8d8ac
	/**
Packit Service d8d8ac
	 * List of TLV descriptors.  Each item in the list contains
Packit Service d8d8ac
	 * pointers to the appended TLVs.
Packit Service d8d8ac
	 */
Packit Service d8d8ac
	TAILQ_HEAD(tlv_list, tlv_extra) tlv_list;
Packit Service d8d8ac
};
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Obtain the action field from a management message.
Packit Service d8d8ac
 * @param m  A management message.
Packit Service d8d8ac
 * @return   The value of the action field.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline uint8_t management_action(struct ptp_message *m)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return m->management.flags & 0x0f;
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Test a given bit in a message's flag field.
Packit Service d8d8ac
 * @param m      Message to test.
Packit Service d8d8ac
 * @param index  Index into flag field, either 0 or 1.
Packit Service d8d8ac
 * @param bit    Bit mask of one bit to test.
Packit Service d8d8ac
 * @return       One if bit is set, zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline Boolean field_is_set(struct ptp_message *m, int index, Octet bit)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return m->header.flagField[index] & bit ? TRUE : FALSE;
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Append a new TLV onto a message for transmission.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This is a high level API designed for the transmit path.  The
Packit Service d8d8ac
 * function allocates a new descriptor, initializes its .tlv field,
Packit Service d8d8ac
 * and ensures that the TLV will fit into the message buffer.  This
Packit Service d8d8ac
 * function increments the message length field by 'length' before
Packit Service d8d8ac
 * returning.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param msg     A message obtained using msg_allocate().  At a mininum,
Packit Service d8d8ac
 *                the message type and length fields must set by the caller.
Packit Service d8d8ac
 * @param length  The length of the TLV to append.
Packit Service d8d8ac
 * @return        A pointer to a TLV descriptor on success or NULL otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct tlv_extra *msg_tlv_append(struct ptp_message *msg, int length);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Place a TLV descriptor into a message's list of TLVs.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param msg     A message obtained using msg_allocate().
Packit Service d8d8ac
 * @param extra   The TLV to be added to the list.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void msg_tlv_attach(struct ptp_message *msg, struct tlv_extra *extra);
Packit Service d8d8ac
Packit Service d8d8ac
/*
Packit Service d8d8ac
 * Return the number of TLVs attached to a message.
Packit Service d8d8ac
 * @param msg  A message obtained using @ref msg_allocate().
Packit Service d8d8ac
 * @return     The number of attached TLVs.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int msg_tlv_count(struct ptp_message *msg);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Obtain the transportSpecific field from a message.
Packit Service d8d8ac
 * @param m  Message to test.
Packit Service d8d8ac
 * @return   The value of the transportSpecific field. Note that the
Packit Service d8d8ac
 *           value is returned unshifted, in the upper nibble.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline UInteger8 msg_transport_specific(struct ptp_message *m)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return m->header.tsmt & 0xf0;
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Obtain the message type.
Packit Service d8d8ac
 * @param m  Message to test.
Packit Service d8d8ac
 * @return   The value of the messageType field.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline int msg_type(struct ptp_message *m)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return m->header.tsmt & 0x0f;
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Allocate a new message instance.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * Messages are reference counted, and newly allocated messages have a
Packit Service d8d8ac
 * reference count of one. Allocated messages are freed using the
Packit Service d8d8ac
 * function @ref msg_put().
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @return Pointer to a message on success, NULL otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct ptp_message *msg_allocate(void);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Release all of the memory in the message cache.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void msg_cleanup(void);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Duplicate a message instance.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * This function accepts a message in network byte order and returns a
Packit Service d8d8ac
 * duplicate in host byte.
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * Messages are reference counted, and newly allocated messages have a
Packit Service d8d8ac
 * reference count of one. Allocated messages are freed using the
Packit Service d8d8ac
 * function @ref msg_put().
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @param msg  A message obtained using @ref msg_allocate().
Packit Service d8d8ac
 *             The passed message must be in network byte order, not
Packit Service d8d8ac
 *             having been passed to @ref msg_post_recv().
Packit Service d8d8ac
 *
Packit Service d8d8ac
 * @return     Pointer to a message on success, NULL otherwise.
Packit Service d8d8ac
 *             The returned message will be in host byte order, having
Packit Service d8d8ac
 *             been passed to @ref msg_post_recv().
Packit Service d8d8ac
 */
Packit Service d8d8ac
struct ptp_message *msg_duplicate(struct ptp_message *msg, int cnt);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Obtain a reference to a message, increasing its reference count by one.
Packit Service d8d8ac
 * @param m A message obtained using @ref msg_allocate().
Packit Service d8d8ac
 */
Packit Service d8d8ac
void msg_get(struct ptp_message *m);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Process messages after reception.
Packit Service d8d8ac
 * @param m    A message obtained using @ref msg_allocate().
Packit Service d8d8ac
 * @param cnt  The size of 'm' in bytes.
Packit Service d8d8ac
 * @return   Zero on success, non-zero if the message is invalid.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int msg_post_recv(struct ptp_message *m, int cnt);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Prepare messages for transmission.
Packit Service d8d8ac
 * @param m  A message obtained using @ref msg_allocate().
Packit Service d8d8ac
 * @return   Zero on success, non-zero if the message is invalid.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int msg_pre_send(struct ptp_message *m);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Print messages for debugging purposes.
Packit Service d8d8ac
 * @param type  Value of the messageType field as returned by @ref msg_type().
Packit Service d8d8ac
 * @return      String describing the message type.
Packit Service d8d8ac
 */
Packit Service d8d8ac
const char *msg_type_string(int type);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Print messages for debugging purposes.
Packit Service d8d8ac
 * @param m   A message obtained using @ref msg_allocate().
Packit Service d8d8ac
 * @param fp  An open file pointer.
Packit Service d8d8ac
 */
Packit Service d8d8ac
void msg_print(struct ptp_message *m, FILE *fp);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Release a reference to a message, decreasing its reference count by one.
Packit Service d8d8ac
 * @param m A message obtained using @ref msg_allocate().
Packit Service d8d8ac
 */
Packit Service d8d8ac
void msg_put(struct ptp_message *m);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Test whether an event message received a valid SO_TIMESTAMPING time stamp.
Packit Service d8d8ac
 * @param m  Message to test.
Packit Service d8d8ac
 * @return   One if the message is an event without a time stamp, zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
int msg_sots_missing(struct ptp_message *m);
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Test whether a message has a valid SO_TIMESTAMPING time stamp.
Packit Service d8d8ac
 * @param m  Message to test.
Packit Service d8d8ac
 * @return   One if the message has a valid time stamp, zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline int msg_sots_valid(struct ptp_message *m)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return !tmv_is_zero(m->hwts.ts);
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Test whether a message is a unicast message.
Packit Service d8d8ac
 * @param m  Message to test.
Packit Service d8d8ac
 * @return   One if the message is unicast, zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline Boolean msg_unicast(struct ptp_message *m)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return field_is_set(m, 0, UNICAST);
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Work around buggy 802.1AS switches.
Packit Service d8d8ac
 */
Packit Service d8d8ac
extern int assume_two_step;
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Test whether a message is one-step message.
Packit Service d8d8ac
 * @param m  Message to test.
Packit Service d8d8ac
 * @return   One if the message is a one-step, zero otherwise.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline Boolean one_step(struct ptp_message *m)
Packit Service d8d8ac
{
Packit Service d8d8ac
	if (assume_two_step)
Packit Service d8d8ac
		return 0;
Packit Service d8d8ac
	return !field_is_set(m, 0, TWO_STEP);
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Convert a 64 bit word into network byte order.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline int64_t host2net64(int64_t val)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return __cpu_to_be64(val);
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
/**
Packit Service d8d8ac
 * Convert a 64 bit word into host byte order.
Packit Service d8d8ac
 */
Packit Service d8d8ac
static inline int64_t net2host64(int64_t val)
Packit Service d8d8ac
{
Packit Service d8d8ac
	return __be64_to_cpu(val);
Packit Service d8d8ac
}
Packit Service d8d8ac
Packit Service d8d8ac
#endif