|
|
@@ -110,6 +110,23 @@ struct rpmsg_ns_msg {
|
|
|
u32 flags;
|
|
|
} __packed;
|
|
|
|
|
|
+/**
|
|
|
+ * struct rpmsg_ns_msg_ext - dynamic name service announcement message v2
|
|
|
+ * @name: name of remote service that is published
|
|
|
+ * @desc: description of remote service
|
|
|
+ * @addr: address of remote service that is published
|
|
|
+ * @flags: indicates whether service is created or destroyed
|
|
|
+ *
|
|
|
+ * Interchangeable nameservice message with rpmsg_ns_msg. This one has
|
|
|
+ * the addition of the desc field for extra flexibility.
|
|
|
+ */
|
|
|
+struct rpmsg_ns_msg_ext {
|
|
|
+ char name[RPMSG_NAME_SIZE];
|
|
|
+ char desc[RPMSG_NAME_SIZE];
|
|
|
+ u32 addr;
|
|
|
+ u32 flags;
|
|
|
+} __packed;
|
|
|
+
|
|
|
/**
|
|
|
* enum rpmsg_ns_flags - dynamic name service announcement flags
|
|
|
*
|
|
|
@@ -402,8 +419,9 @@ static struct rpmsg_device *rpmsg_create_channel(struct virtproc_info *vrp,
|
|
|
if (tmp) {
|
|
|
/* decrement the matched device's refcount back */
|
|
|
put_device(tmp);
|
|
|
- dev_err(dev, "channel %s:%x:%x already exist\n",
|
|
|
- chinfo->name, chinfo->src, chinfo->dst);
|
|
|
+ dev_err(dev, "channel %s:%s:%x:%x already exist\n",
|
|
|
+ chinfo->name, chinfo->desc,
|
|
|
+ chinfo->src, chinfo->dst);
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
@@ -419,6 +437,7 @@ static struct rpmsg_device *rpmsg_create_channel(struct virtproc_info *vrp,
|
|
|
rpdev->src = chinfo->src;
|
|
|
rpdev->dst = chinfo->dst;
|
|
|
rpdev->ops = &virtio_rpmsg_ops;
|
|
|
+ strncpy(rpdev->desc, chinfo->desc, RPMSG_NAME_SIZE);
|
|
|
|
|
|
/*
|
|
|
* rpmsg server channels has predefined local address (for now),
|
|
|
@@ -816,18 +835,29 @@ static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len,
|
|
|
void *priv, u32 src)
|
|
|
{
|
|
|
struct rpmsg_ns_msg *msg = data;
|
|
|
+ struct rpmsg_ns_msg_ext *msg_ext = data;
|
|
|
struct rpmsg_device *newch;
|
|
|
struct rpmsg_channel_info chinfo;
|
|
|
struct virtproc_info *vrp = priv;
|
|
|
struct device *dev = &vrp->vdev->dev;
|
|
|
int ret;
|
|
|
+ u32 addr;
|
|
|
+ u32 flags;
|
|
|
|
|
|
#if defined(CONFIG_DYNAMIC_DEBUG)
|
|
|
dynamic_hex_dump("NS announcement: ", DUMP_PREFIX_NONE, 16, 1,
|
|
|
data, len, true);
|
|
|
#endif
|
|
|
|
|
|
- if (len != sizeof(*msg)) {
|
|
|
+ if (len == sizeof(*msg)) {
|
|
|
+ addr = msg->addr;
|
|
|
+ flags = msg->flags;
|
|
|
+ chinfo.desc[0] = '\0';
|
|
|
+ } else if (len == sizeof(*msg_ext)) {
|
|
|
+ addr = msg_ext->addr;
|
|
|
+ flags = msg_ext->flags;
|
|
|
+ strncpy(chinfo.desc, msg_ext->desc, sizeof(chinfo.desc));
|
|
|
+ } else if (len != sizeof(*msg)) {
|
|
|
dev_err(dev, "malformed ns msg (%d)\n", len);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
@@ -847,14 +877,14 @@ static int rpmsg_ns_cb(struct rpmsg_device *rpdev, void *data, int len,
|
|
|
msg->name[RPMSG_NAME_SIZE - 1] = '\0';
|
|
|
|
|
|
dev_info(dev, "%sing channel %s addr 0x%x\n",
|
|
|
- msg->flags & RPMSG_NS_DESTROY ? "destroy" : "creat",
|
|
|
- msg->name, msg->addr);
|
|
|
+ flags & RPMSG_NS_DESTROY ? "destroy" : "creat",
|
|
|
+ msg->name, addr);
|
|
|
|
|
|
strncpy(chinfo.name, msg->name, sizeof(chinfo.name));
|
|
|
chinfo.src = RPMSG_ADDR_ANY;
|
|
|
- chinfo.dst = msg->addr;
|
|
|
+ chinfo.dst = addr;
|
|
|
|
|
|
- if (msg->flags & RPMSG_NS_DESTROY) {
|
|
|
+ if (flags & RPMSG_NS_DESTROY) {
|
|
|
ret = rpmsg_unregister_device(&vrp->vdev->dev, &chinfo);
|
|
|
if (ret)
|
|
|
dev_err(dev, "rpmsg_destroy_channel failed: %d\n", ret);
|