2 * VMware vSockets Driver
4 * Copyright (C) 2007-2012 VMware, Inc. All rights reserved.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the Free
8 * Software Foundation version 2 and no later version.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 #include <linux/types.h>
17 #include <linux/socket.h>
18 #include <linux/stddef.h>
21 #include "vsock_addr.h"
23 void vsock_addr_init(struct sockaddr_vm
*addr
, u32 cid
, u32 port
)
25 memset(addr
, 0, sizeof(*addr
));
26 addr
->svm_family
= AF_VSOCK
;
28 addr
->svm_port
= port
;
30 EXPORT_SYMBOL_GPL(vsock_addr_init
);
32 int vsock_addr_validate(const struct sockaddr_vm
*addr
)
37 if (addr
->svm_family
!= AF_VSOCK
)
40 if (addr
->svm_zero
[0] != 0)
45 EXPORT_SYMBOL_GPL(vsock_addr_validate
);
47 bool vsock_addr_bound(const struct sockaddr_vm
*addr
)
49 return addr
->svm_port
!= VMADDR_PORT_ANY
;
51 EXPORT_SYMBOL_GPL(vsock_addr_bound
);
53 void vsock_addr_unbind(struct sockaddr_vm
*addr
)
55 vsock_addr_init(addr
, VMADDR_CID_ANY
, VMADDR_PORT_ANY
);
57 EXPORT_SYMBOL_GPL(vsock_addr_unbind
);
59 bool vsock_addr_equals_addr(const struct sockaddr_vm
*addr
,
60 const struct sockaddr_vm
*other
)
62 return addr
->svm_cid
== other
->svm_cid
&&
63 addr
->svm_port
== other
->svm_port
;
65 EXPORT_SYMBOL_GPL(vsock_addr_equals_addr
);
67 bool vsock_addr_equals_addr_any(const struct sockaddr_vm
*addr
,
68 const struct sockaddr_vm
*other
)
70 return (addr
->svm_cid
== VMADDR_CID_ANY
||
71 other
->svm_cid
== VMADDR_CID_ANY
||
72 addr
->svm_cid
== other
->svm_cid
) &&
73 addr
->svm_port
== other
->svm_port
;
75 EXPORT_SYMBOL_GPL(vsock_addr_equals_addr_any
);
77 int vsock_addr_cast(const struct sockaddr
*addr
,
78 size_t len
, struct sockaddr_vm
**out_addr
)
80 if (len
< sizeof(**out_addr
))
83 *out_addr
= (struct sockaddr_vm
*)addr
;
84 return vsock_addr_validate(*out_addr
);
86 EXPORT_SYMBOL_GPL(vsock_addr_cast
);