RV_IBC_SEND

This ioctl can only be issued against the Primary RVG with a valid key obtained from the RV_IBC_REGISTER ioctl. The ioctl inserts an IBC message into the data update stream of one or all RLINKs attached to the RVG.

If it is desired that an IBC message be inserted at an exact location in the update stream, such as a point of application-level consistency, then there must be no concurrent write activity to the RVG when the RV_IBC_SEND ioctl is issued. Note that writes made to the block device interface of a data volume may be cached, so a disk sync must be done before issuing the ioctl. If there are active writes to the RVG when the ioctl is issued, the insertion point of the IBC message in the RLINK update data stream is arbitrary in relation to that activity.

The ioctl returns using the same semantics as a data write to the RVG; it returns when the IBC message has been committed to the SRL and has also been transferred to all synchronous-mode replicas attached to the RVG.

The ioctl argument structure for the RV_IBC_SEND command is:

    struct ibc_send_args {          /* IOCTL_STRUCT */
        vx_u32_t        ibc_magic;
        vx_u32_t        ibc_version;
        ibc_appid_t     application_id;
        char            replica[NAME_SZ];
        int             flags;
        int             freeze_timeout;
        caddr_t         msg_buf;
        int             msg_len;
};

Argument ibc_magic is used to verify whether the ioctl structure is a valid 4.0 structure. It should be set to NM_IBC_MAGIC.

Argument ibc_version specifies the current IBC version. It should be set to NM_IBC_VERSION.

Argument application_id is the key returned by the RV_IBC_REGISTER ioctl. A registration must be done before the RV_IBC_SEND ioctl can be used.

Argument replica specifies the name of the RLINK to which the IBC message is to be send. The null string specifies a broadcast to all RLINKs currently attached to the Primary RVG.

Argument flags set to IBC_FREEZE causes the secondary replication to freeze for the time-out period specified in freeze_timeout. If replication is not desired to be frozen, then flags should be set to 0.

Argument freeze_timeout specifies a time-out value in seconds between delivery of an IBC message on the Secondary and execution of an RV_IBC_UNFREEZE ioctl against the Secondary RVG. When the time-out expires, replication at the Secondary continues. A time-out value of zero is used to specify no time-out.

Argument msg_buf is a pointer to a buffer containing an IBC message. The content of an IBC message is user-defined and has no restriction except size.

Argument msg_len is the length, in bytes, of the IBC message and can be no greater than 128k bytes.

On failure, possible values returned in errno are:

EIBC_NO_RLINK

No RLINK or specified RLINK exists

EIO I/O

I/O error while logging the IBC message

EIBC_MSG_LENGTH

Message is greater than maximum allowable length (128K)