В каком формате мне следует подчиняться, когда я передаю строку в kernel_sendmsg? - PullRequest
1 голос
/ 12 апреля 2020

Недавно я модифицировал некоторые программы сокетов в пространстве ядра. Ниже приводится базовая c функция отправки на сервер:

static int http_server_send(struct socket *sock, const char *buf, size_t size)
{
    struct msghdr msg = {.msg_name = NULL,
                         .msg_namelen = 0,
                         .msg_control = NULL,
                         .msg_controllen = 0,
                         .msg_flags = 0};
    int done = 0;
    while (done < size) {
        struct kvec iov = {
            .iov_base = (void *) ((char *) buf + done),
            .iov_len = size - done,
        };
        int length = kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len);
        if (length < 0) {
            pr_err("write error: %d\n", length);
            break;
        }
        done += length;
    }
    return done;
}

Я обнаружил buf или iov_base, следуя некоторому заданному формату c, когда он был передан, формат похож на следующий, который определяется как макрос (CRLF) определено как "\ r \ n"):

    ""                                                        \
    "HTTP/1.1 200 OK" CRLF "Server: " KBUILD_MODNAME CRLF     \
    "Content-Type: text/plain" CRLF "Content-Length: %d" CRLF \
    "Connection: Close" CRLF CRLF "%s" CRLF

Некоторые из вышеуказанного формата, кажется, не могут быть изменены (Изменено не удастся отправить сообщение), возможно, это своего рода протокол. Мой вопрос: есть ли какой-либо документ или ссылка, могу ли я найти регламент этого формата?

...