Commit e762ae5d authored by David S. Miller's avatar David S. Miller

Merge branch 'net-qrtr-Nameserver-fixes'

Bjorn Andersson says:

====================
net: qrtr: Nameserver fixes

The need to respond to the HELLO message from the firmware was lost in the
translation from the user space implementation of the nameserver. Fixing this
also means we can remove the FIXME related to launching the ns.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 30a87f15 71046abf
...@@ -286,9 +286,38 @@ static int server_del(struct qrtr_node *node, unsigned int port) ...@@ -286,9 +286,38 @@ static int server_del(struct qrtr_node *node, unsigned int port)
return 0; return 0;
} }
static int say_hello(struct sockaddr_qrtr *dest)
{
struct qrtr_ctrl_pkt pkt;
struct msghdr msg = { };
struct kvec iv;
int ret;
iv.iov_base = &pkt;
iv.iov_len = sizeof(pkt);
memset(&pkt, 0, sizeof(pkt));
pkt.cmd = cpu_to_le32(QRTR_TYPE_HELLO);
msg.msg_name = (struct sockaddr *)dest;
msg.msg_namelen = sizeof(*dest);
ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
if (ret < 0)
pr_err("failed to send hello msg\n");
return ret;
}
/* Announce the list of servers registered on the local node */ /* Announce the list of servers registered on the local node */
static int ctrl_cmd_hello(struct sockaddr_qrtr *sq) static int ctrl_cmd_hello(struct sockaddr_qrtr *sq)
{ {
int ret;
ret = say_hello(sq);
if (ret < 0)
return ret;
return announce_servers(sq); return announce_servers(sq);
} }
...@@ -566,29 +595,6 @@ static void ctrl_cmd_del_lookup(struct sockaddr_qrtr *from, ...@@ -566,29 +595,6 @@ static void ctrl_cmd_del_lookup(struct sockaddr_qrtr *from,
} }
} }
static int say_hello(void)
{
struct qrtr_ctrl_pkt pkt;
struct msghdr msg = { };
struct kvec iv;
int ret;
iv.iov_base = &pkt;
iv.iov_len = sizeof(pkt);
memset(&pkt, 0, sizeof(pkt));
pkt.cmd = cpu_to_le32(QRTR_TYPE_HELLO);
msg.msg_name = (struct sockaddr *)&qrtr_ns.bcast_sq;
msg.msg_namelen = sizeof(qrtr_ns.bcast_sq);
ret = kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt));
if (ret < 0)
pr_err("failed to send hello msg\n");
return ret;
}
static void qrtr_ns_worker(struct work_struct *work) static void qrtr_ns_worker(struct work_struct *work)
{ {
const struct qrtr_ctrl_pkt *pkt; const struct qrtr_ctrl_pkt *pkt;
...@@ -687,7 +693,7 @@ static void qrtr_ns_data_ready(struct sock *sk) ...@@ -687,7 +693,7 @@ static void qrtr_ns_data_ready(struct sock *sk)
queue_work(qrtr_ns.workqueue, &qrtr_ns.work); queue_work(qrtr_ns.workqueue, &qrtr_ns.work);
} }
void qrtr_ns_init(struct work_struct *work) void qrtr_ns_init(void)
{ {
struct sockaddr_qrtr sq; struct sockaddr_qrtr sq;
int ret; int ret;
...@@ -725,7 +731,7 @@ void qrtr_ns_init(struct work_struct *work) ...@@ -725,7 +731,7 @@ void qrtr_ns_init(struct work_struct *work)
if (!qrtr_ns.workqueue) if (!qrtr_ns.workqueue)
goto err_sock; goto err_sock;
ret = say_hello(); ret = say_hello(&qrtr_ns.bcast_sq);
if (ret < 0) if (ret < 0)
goto err_wq; goto err_wq;
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include <linux/termios.h> /* For TIOCINQ/OUTQ */ #include <linux/termios.h> /* For TIOCINQ/OUTQ */
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/workqueue.h>
#include <net/sock.h> #include <net/sock.h>
...@@ -110,8 +109,6 @@ static DEFINE_MUTEX(qrtr_node_lock); ...@@ -110,8 +109,6 @@ static DEFINE_MUTEX(qrtr_node_lock);
static DEFINE_IDR(qrtr_ports); static DEFINE_IDR(qrtr_ports);
static DEFINE_MUTEX(qrtr_port_lock); static DEFINE_MUTEX(qrtr_port_lock);
static struct delayed_work qrtr_ns_work;
/** /**
* struct qrtr_node - endpoint node * struct qrtr_node - endpoint node
* @ep_lock: lock for endpoint management and callbacks * @ep_lock: lock for endpoint management and callbacks
...@@ -1263,11 +1260,7 @@ static int __init qrtr_proto_init(void) ...@@ -1263,11 +1260,7 @@ static int __init qrtr_proto_init(void)
return rc; return rc;
} }
/* FIXME: Currently, this 2s delay is required to catch the NEW_SERVER qrtr_ns_init();
* messages from routers. But the fix could be somewhere else.
*/
INIT_DELAYED_WORK(&qrtr_ns_work, qrtr_ns_init);
schedule_delayed_work(&qrtr_ns_work, msecs_to_jiffies(2000));
return rc; return rc;
} }
...@@ -1275,7 +1268,6 @@ postcore_initcall(qrtr_proto_init); ...@@ -1275,7 +1268,6 @@ postcore_initcall(qrtr_proto_init);
static void __exit qrtr_proto_fini(void) static void __exit qrtr_proto_fini(void)
{ {
cancel_delayed_work_sync(&qrtr_ns_work);
qrtr_ns_remove(); qrtr_ns_remove();
sock_unregister(qrtr_family.family); sock_unregister(qrtr_family.family);
proto_unregister(&qrtr_proto); proto_unregister(&qrtr_proto);
......
...@@ -29,7 +29,7 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep); ...@@ -29,7 +29,7 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep);
int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len); int qrtr_endpoint_post(struct qrtr_endpoint *ep, const void *data, size_t len);
void qrtr_ns_init(struct work_struct *work); void qrtr_ns_init(void);
void qrtr_ns_remove(void); void qrtr_ns_remove(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment