Mô hình trừu tượng của TCP

Mô-đun này bao gồm các mô-đun trừu tượng dễ sử dụng trên API TCP cơ sở.

Tóm tắt

Bảng liệt kê

anonymous enum enum
Xác định cờ được truyền đến otTcpCircularSendBufferWrite.

Typedef

otTcpCircularSendBuffer typedef
Biểu thị vùng đệm gửi tròn để sử dụng với điểm cuối TCP.
otTcpEndpointAndCircularSendBuffer typedef
Cấu trúc ngữ cảnh để sử dụng với mbedtls_SSL_set_bio.

Hàm

otTcpCircularSendBufferDeinitialize(otTcpCircularSendBuffer *aSendBuffer)
Huỷ khởi động vùng đệm gửi vòng tròn TCP, tách vùng đệm này nếu được đính kèm.
otTcpCircularSendBufferForceDiscardAll(otTcpCircularSendBuffer *aSendBuffer)
void
Buộc loại bỏ tất cả dữ liệu trong vùng đệm gửi vòng tròn.
otTcpCircularSendBufferGetFreeSpace(const otTcpCircularSendBuffer *aSendBuffer)
size_t
Trả về dung lượng trống trong vùng đệm gửi vòng tròn TCP.
otTcpCircularSendBufferHandleForwardProgress(otTcpCircularSendBuffer *aSendBuffer, size_t aInSendBuffer)
void
Thực hiện xử lý cụ thể theo vòng tròn-gửi-bộ đệm trong lệnh gọi lại otTcpForwardProgress.
otTcpCircularSendBufferInitialize(otTcpCircularSendBuffer *aSendBuffer, void *aDataBuffer, size_t aCapacity)
void
Khởi động vùng đệm gửi vòng tròn TCP.
otTcpCircularSendBufferWrite(otTcpEndpoint *aEndpoint, otTcpCircularSendBuffer *aSendBuffer, const void *aData, size_t aLength, size_t *aWritten, uint32_t aFlags)
Gửi dữ liệu trên điểm cuối TCP, sử dụng bộ đệm gửi vòng tròn TCP được cung cấp để quản lý việc lưu vào bộ đệm.
otTcpMbedTlsSslRecvCallback(void *aCtx, unsigned char *aBuf, size_t aLen)
int
Phương thức không chặn nhận lệnh gọi lại để truyền tới mbedtls_SSL_set_bio.
otTcpMbedTlsSslSendCallback(void *aCtx, const unsigned char *aBuf, size_t aLen)
int
Phương thức không chặn lệnh gọi lại để truyền tới mbedtls_SSL_set_bio.

Cấu trúc

otTcpCircularSendBuffer

Biểu thị vùng đệm gửi tròn để sử dụng với điểm cuối TCP.

otTcpEndpointAndCircularSendBuffer

Cấu trúc ngữ cảnh để sử dụng với mbedtls_SSL_set_bio.

Bảng liệt kê

enum ẩn danh

 anonymous enum

Xác định cờ được truyền đến otTcpCircularSendBufferWrite.

Typedef

otTcpCircularSendBuffer

struct otTcpCircularSendBuffer otTcpCircularSendBuffer

Biểu thị vùng đệm gửi tròn để sử dụng với điểm cuối TCP.

Không bắt buộc phải sử dụng vùng đệm gửi vòng tròn. Các ứng dụng có thể dùng điểm cuối TCP để gửi dữ liệu bằng cách quản lý trực tiếp otLinkedBuffers. Tuy nhiên, một số ứng dụng có thể thấy thuận tiện hơn khi có vùng đệm gửi vòng tròn; các ứng dụng như vậy có thể gọi otTcpCircularSendBufferWrite() để "đính kèm" bộ đệm gửi vòng tròn đến điểm cuối TCP và gửi dữ liệu trên điểm cuối TCP đó, dựa vào vùng đệm gửi tròn để quản lý otLinkedBuffers cơ bản.

otTcpCircularSendBuffer được triển khai trên API dựa trên otLinkedBuffer do otTcpEndpoint cung cấp. Sau khi được đính kèm vào một otTcpEndpoint, một otTcpCircularSendBuffer sẽ thực hiện tất cả công việc quản lý otLinkedBuffers cho kết nối. Điều này có nghĩa là sau khi một otTcpCircularSendBuffer được đính kèm vào một otTcpEndpoint, ứng dụng không được gọi otTcpSendByReference() hoặc otTcpSendByExtension() trên otTcpEndpoint đó. Thay vào đó, ứng dụng phải sử dụng otTcpCircularSendBufferWrite() để thêm dữ liệu vào bộ đệm gửi.

Lệnh gọi lại otTcpForwardProgress() là cách thức để người dùng tìm hiểu thời điểm có dung lượng trong vùng đệm gửi vòng tròn. Trên một otTcpEndpoint được đính kèm otTcpCircularSendBuffer, ứng dụng PHẢI cài đặt lệnh gọi lại otTcpForwardProgress() và gọi otTcpCircularSendBufferHandleForwardProgress() đính kèm trên otTcpCircularSendBuffer ở đầu hàm callback. Người dùng KHÔNG nên cài đặt lệnh gọi lại otTcpSendDone(), vì mọi hoạt động quản lý otLinkedBuffers đều được xử lý bằng vùng đệm gửi tròn.

Ứng dụng không được kiểm tra trực tiếp các trường của cấu trúc này; ứng dụng chỉ nên tương tác với ứng dụng thông qua các hàm TCP Circular Send Buffer API có chữ ký được cung cấp trong tệp này.

otTcpEndpointAndCircularSendBuffer

struct otTcpEndpointAndCircularSendBuffer otTcpEndpointAndCircularSendBuffer

Cấu trúc ngữ cảnh để sử dụng với mbedtls_SSL_set_bio.

Hàm

otTcpCircularSendBufferDeinitialize

otError otTcpCircularSendBufferDeinitialize(
  otTcpCircularSendBuffer *aSendBuffer
)

Huỷ khởi động vùng đệm gửi vòng tròn TCP, tách vùng đệm này nếu được đính kèm.

Nếu bộ đệm gửi vòng tròn TCP không trống, thì thao tác này sẽ không thành công.

Thông tin chi tiết
Thông số
[in] aSendBuffer
Vùng đệm gửi vòng tròn TCP để huỷ khởi tạo.
Giá trị trả về
OT_ERROR_NONE
Huỷ khởi động thành công vùng đệm gửi vòng tròn TCP.
OT_ERROR_BUSY
Vùng đệm tròn chứa dữ liệu và không thể khởi tạo.

otTcpCircularSendBufferForceDiscardAll

void otTcpCircularSendBufferForceDiscardAll(
  otTcpCircularSendBuffer *aSendBuffer
)

Buộc loại bỏ tất cả dữ liệu trong vùng đệm gửi vòng tròn.

Ứng dụng dự kiến sẽ gọi chức năng này khi kết nối TCP bị chấm dứt một cách không đáng kể (ví dụ: nếu ứng dụng gọi otTcpEndpointUnsubscribe() hoặc được thông báo về kết nối đặt lại qua lệnh gọi lại otTcpConnectionSaved()).

Việc gọi hàm này trên bộ đệm gửi vòng tròn TCP không trống được đính kèm với điểm cuối TCP sẽ dẫn đến hành vi không xác định.

Thông tin chi tiết
Thông số
[in] aSendBuffer
Vùng đệm gửi vòng tròn TCP có dữ liệu cần loại bỏ.

otTcpCircularSendBufferGetFreeSpace

size_t otTcpCircularSendBufferGetFreeSpace(
  const otTcpCircularSendBuffer *aSendBuffer
)

Trả về dung lượng trống trong vùng đệm gửi vòng tròn TCP.

Thao tác này sẽ luôn thành công.

Thông tin chi tiết
Thông số
[in] aSendBuffer
Con trỏ đến vùng đệm gửi vòng tròn TCP có lượng dung lượng trống cần trả về.
Trả về
Dung lượng trống trong vùng đệm gửi.

otTcpCircularSendBufferHandleForwardProgress

void otTcpCircularSendBufferHandleForwardProgress(
  otTcpCircularSendBuffer *aSendBuffer,
  size_t aInSendBuffer
)

Thực hiện xử lý cụ thể theo vòng tròn-gửi-bộ đệm trong lệnh gọi lại otTcpForwardProgress.

Ứng dụng dự kiến sẽ cài đặt lệnh gọi lại otTcpForwardProgress() trên otTcpEndpoint và gọi hàm này khi bắt đầu hàm callback để xử lý một vòng tròn-send-buffer- cụ thể.

Trong hàm callback, ứng dụng có thể xác định dung lượng trống trong vùng đệm gửi tròn bằng cách gọi otTcpCircularSendBufferFreeSpace() hoặc bằng cách so sánh aInSendBuffer với dung lượng của bộ đệm gửi mà người dùng chọn khi gọi otTcpCircularSendBufferInitialize().

Thông tin chi tiết
Thông số
[in] aSendBuffer
Con trỏ đến vùng đệm gửi vòng tròn TCP cho điểm cuối mà otTcpForwardProgress() đã được gọi.
[in] aInSendBuffer
Giá trị của aInSendBuffer được truyền đến lệnh gọi lại otTcpForwardProgress().

otTcpCircularSendBufferInitialize

void otTcpCircularSendBufferInitialize(
  otTcpCircularSendBuffer *aSendBuffer,
  void *aDataBuffer,
  size_t aCapacity
)

Khởi động vùng đệm gửi vòng tròn TCP.

Thông tin chi tiết
Thông số
[in] aSendBuffer
Một con trỏ đến vùng đệm gửi vòng tròn TCP để khởi động.
[in] aDataBuffer
Con trỏ tới bộ nhớ dùng để lưu trữ dữ liệu trong vùng đệm gửi tròn TCP.
[in] aCapacity
Dung lượng (tính bằng byte) của vùng đệm gửi vòng tròn TCP phải bằng với kích thước của bộ nhớ do aDataBuffer trỏ đến .

otTcpCircularSendBufferWrite

otError otTcpCircularSendBufferWrite(
  otTcpEndpoint *aEndpoint,
  otTcpCircularSendBuffer *aSendBuffer,
  const void *aData,
  size_t aLength,
  size_t *aWritten,
  uint32_t aFlags
)

Gửi dữ liệu trên điểm cuối TCP, sử dụng bộ đệm gửi vòng tròn TCP được cung cấp để quản lý việc lưu vào bộ đệm.

Sau khi hàm này được gọi, aSendBufferaEndpoint được coi là "đính kèm" với nhau. Khi được đính kèm, TẤT CẢ thao tác gửi cho aEndpoint phải được thực hiện bằng aSendBuffer và TẤT CẢ thao tác trên aSendBuffer phải được liên kết với aEndpoint .

Cách duy nhất để "tách" vùng đệm gửi vòng tròn TCP và điểm cuối TCP là đợi bộ đệm gửi hoàn toàn trống. Điều này có thể xảy ra theo 2 cách: (1) tất cả dữ liệu trong vùng đệm gửi được gửi đi và xác nhận trong tiến trình thông thường của giao thức TCP, hoặc (2) kết nối bị chấm dứt.

Mô hình sử dụng đề xuất là sử dụng một vùng đệm gửi vòng tròn TCP với điểm cuối TCP và chỉ gửi dữ liệu về điểm cuối TCP đó qua vùng đệm tròn TCP đã liên kết. Mô hình sử dụng được đề xuất này sẽ giúp bỏ qua các vấn đề được mô tả ở trên bằng cách luôn sử dụng điểm cuối TCP và bộ đệm gửi vòng tròn TCP cùng nhau.

Nếu vùng đệm gửi vòng đạt dung lượng, chỉ một tiền tố của dữ liệu đã cung cấp được sao chép vào vùng đệm gửi vòng.

Thông tin chi tiết
Thông số
[in] aEndpoint
Điểm cuối TCP mà trên đó sẽ gửi dữ liệu.
[in] aSendBuffer
Vùng đệm gửi vòng tròn TCP để sao chép dữ liệu vào đó.
[in] aData
Con trỏ tới dữ liệu cần sao chép vào vùng đệm gửi vòng tròn TCP.
[in] aLength
Độ dài của dữ liệu do aData trỏ đến để sao chép vào vùng đệm gửi vòng tròn TCP.
[out] aWritten
Được điền sẵn lượng dữ liệu được sao chép vào vùng đệm gửi. Dung lượng này có thể nhỏ hơn aLength nếu vùng đệm gửi đạt dung lượng.
[in] aFlags
Cờ chỉ định các tuỳ chọn cho thao tác này (xem bảng liệt kê ở trên).
Giá trị trả về
OT_ERROR_NONE
Đã sao chép thành công dữ liệu vào vùng đệm gửi và gửi dữ liệu này đến điểm cuối TCP.
OT_ERROR_FAILED
Không gửi được dữ liệu trên điểm cuối TCP.

otTcpMbedTlsSslRecvCallback

int otTcpMbedTlsSslRecvCallback(
  void *aCtx,
  unsigned char *aBuf,
  size_t aLen
)

Phương thức không chặn nhận lệnh gọi lại để truyền tới mbedtls_SSL_set_bio.

Thông tin chi tiết
Thông số
[in] aCtx
Con trỏ đến một otTcpEndpointAndCircularSendBuffer.
[out] aBuf
Vùng đệm nhận dữ liệu.
[in] aLen
Lượng dữ liệu tối đa có thể nhận được.
Trả về
Số byte nhận được hoặc mã lỗi mbedtls.

otTcpMbedTlsSslSendCallback

int otTcpMbedTlsSslSendCallback(
  void *aCtx,
  const unsigned char *aBuf,
  size_t aLen
)

Phương thức không chặn lệnh gọi lại để truyền tới mbedtls_SSL_set_bio.

Thông tin chi tiết
Thông số
[in] aCtx
Con trỏ đến một otTcpEndpointAndCircularSendBuffer.
[in] aBuf
Dữ liệu cần thêm vào vùng đệm gửi.
[in] aLen
Lượng dữ liệu cần thêm vào vùng đệm gửi.
Trả về
Số byte đã gửi hoặc mã lỗi mbedtls.

Tài nguyên

Các chủ đề tham khảo API OpenThread bắt nguồn từ mã nguồn, có trên GitHub. Để biết thêm thông tin hoặc để đóng góp cho tài liệu của chúng tôi, hãy tham khảo Tài nguyên.