diff options
-rw-r--r-- | net/qrtr/qrtr.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index d7516098b5aa..c7a5d861906b 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c | |||
@@ -530,6 +530,26 @@ static int qrtr_port_assign(struct qrtr_sock *ipc, int *port) | |||
530 | return 0; | 530 | return 0; |
531 | } | 531 | } |
532 | 532 | ||
533 | /* Reset all non-control ports */ | ||
534 | static void qrtr_reset_ports(void) | ||
535 | { | ||
536 | struct qrtr_sock *ipc; | ||
537 | int id; | ||
538 | |||
539 | mutex_lock(&qrtr_port_lock); | ||
540 | idr_for_each_entry(&qrtr_ports, ipc, id) { | ||
541 | /* Don't reset control port */ | ||
542 | if (id == 0) | ||
543 | continue; | ||
544 | |||
545 | sock_hold(&ipc->sk); | ||
546 | ipc->sk.sk_err = ENETRESET; | ||
547 | wake_up_interruptible(sk_sleep(&ipc->sk)); | ||
548 | sock_put(&ipc->sk); | ||
549 | } | ||
550 | mutex_unlock(&qrtr_port_lock); | ||
551 | } | ||
552 | |||
533 | /* Bind socket to address. | 553 | /* Bind socket to address. |
534 | * | 554 | * |
535 | * Socket should be locked upon call. | 555 | * Socket should be locked upon call. |
@@ -558,6 +578,10 @@ static int __qrtr_bind(struct socket *sock, | |||
558 | 578 | ||
559 | sock_reset_flag(sk, SOCK_ZAPPED); | 579 | sock_reset_flag(sk, SOCK_ZAPPED); |
560 | 580 | ||
581 | /* Notify all open ports about the new controller */ | ||
582 | if (port == QRTR_PORT_CTRL) | ||
583 | qrtr_reset_ports(); | ||
584 | |||
561 | return 0; | 585 | return 0; |
562 | } | 586 | } |
563 | 587 | ||