/* * -------------------------------------------------------------------------- * Appends a nested Netlink attribute of the given 'type', with the 'size' * bytes of content starting at 'data', to 'msg'. * Refer nl_msg_put_nested for more details. * -------------------------------------------------------------------------- */ VOID NlMsgPutNested(PNL_BUFFER buf, UINT16 type, const PVOID data, UINT32 size) { UINT32 offset = NlMsgStartNested(buf, type); BOOLEAN ret = FALSE; ASSERT(offset); ret = NlMsgPutTail(buf, data, size); ASSERT(ret); NlMsgEndNested(buf, offset); }
NDIS_STATUS OvsCtMapTcpProtoInfoToNl(PNL_BUFFER nlBuf, OVS_CT_ENTRY *conn_) { struct conn_tcp *conn = OvsCastConntrackEntryToTcpEntry(conn_); NDIS_STATUS status = NDIS_STATUS_SUCCESS; UINT32 offset = 0; offset = NlMsgStartNested(nlBuf, CTA_PROTOINFO_TCP); if (!offset) { return NDIS_STATUS_FAILURE; } if (!NlMsgPutTailU8(nlBuf, CTA_PROTOINFO_TCP_STATE, conn->peer[0].state)) { status = NDIS_STATUS_FAILURE; goto done; } if (!NlMsgPutTailU8(nlBuf, CTA_PROTOINFO_TCP_WSCALE_ORIGINAL, (conn->peer[0].wscale & CT_WSCALE_MASK))) { status = NDIS_STATUS_FAILURE; goto done; } if (!NlMsgPutTailU8(nlBuf, CTA_PROTOINFO_TCP_WSCALE_REPLY, (conn->peer[1].wscale & CT_WSCALE_MASK))) { status = NDIS_STATUS_FAILURE; goto done; } if (!NlMsgPutTailU16(nlBuf, CTA_PROTOINFO_TCP_FLAGS_ORIGINAL, OvsCtTcpPeerToProtoInfoFlags(&conn->peer[0]))) { status = NDIS_STATUS_FAILURE; goto done; } if (!NlMsgPutTailU16(nlBuf, CTA_PROTOINFO_TCP_FLAGS_REPLY, OvsCtTcpPeerToProtoInfoFlags(&conn->peer[1]))) { status = NDIS_STATUS_FAILURE; goto done; } done: NlMsgEndNested(nlBuf, offset); return status; }