From 5c3df1f0967e2166fff9c026ff1f616a89cab391 Mon Sep 17 00:00:00 2001 From: Greg Kurz Date: Tue, 3 Jan 2017 17:28:44 +0100 Subject: [PATCH] tests: virtio-9p: add attach operation test The attach operation is used to establish a connection between the client and the server. After this, the client is able to access the underlying filesystem and do I/O. This test simply ensures the operation succeeds without error. Reference: http://man.cat-v.org/plan_9/5/attach Signed-off-by: Greg Kurz --- tests/virtio-9p-test.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/virtio-9p-test.c b/tests/virtio-9p-test.c index b3ee956cbc..37a256ef4a 100644 --- a/tests/virtio-9p-test.c +++ b/tests/virtio-9p-test.c @@ -25,6 +25,7 @@ typedef struct { QOSState *qs; QVirtQueue *vq; char *test_share; + uint16_t p9_req_tag; } QVirtIO9P; static QVirtIO9P *qvirtio_9p_start(const char *driver) @@ -304,6 +305,35 @@ static void v9fs_rversion(P9Req *req, uint16_t *len, char **version) v9fs_req_free(req); } +/* size[4] Tattach tag[2] fid[4] afid[4] uname[s] aname[s] n_uname[4] */ +static P9Req *v9fs_tattach(QVirtIO9P *v9p, uint32_t fid, uint32_t n_uname) +{ + const char *uname = ""; /* ignored by QEMU */ + const char *aname = ""; /* ignored by QEMU */ + P9Req *req = v9fs_req_init(v9p, 4 + 4 + 2 + 2 + 4, P9_TATTACH, + ++(v9p->p9_req_tag)); + + v9fs_uint32_write(req, fid); + v9fs_uint32_write(req, P9_NOFID); + v9fs_string_write(req, uname); + v9fs_string_write(req, aname); + v9fs_uint32_write(req, n_uname); + v9fs_req_send(req); + return req; +} + +typedef char v9fs_qid[13]; + +/* size[4] Rattach tag[2] qid[13] */ +static void v9fs_rattach(P9Req *req, v9fs_qid *qid) +{ + v9fs_req_recv(req, P9_RATTACH); + if (qid) { + v9fs_memread(req, qid, 13); + } + v9fs_req_free(req); +} + static void fs_version(QVirtIO9P *v9p) { const char *version = "9P2000.L"; @@ -319,6 +349,15 @@ static void fs_version(QVirtIO9P *v9p) g_free(server_version); } +static void fs_attach(QVirtIO9P *v9p) +{ + P9Req *req; + + fs_version(v9p); + req = v9fs_tattach(v9p, 0, getuid()); + v9fs_rattach(req, NULL); +} + typedef void (*v9fs_test_fn)(QVirtIO9P *v9p); static void v9fs_run_pci_test(gconstpointer data) @@ -343,6 +382,7 @@ int main(int argc, char **argv) v9fs_qtest_pci_add("/virtio/9p/pci/nop", NULL); v9fs_qtest_pci_add("/virtio/9p/pci/config", pci_config); v9fs_qtest_pci_add("/virtio/9p/pci/fs/version/basic", fs_version); + v9fs_qtest_pci_add("/virtio/9p/pci/fs/attach/basic", fs_attach); return g_test_run(); } -- GitLab