From a152f8a36128ce99cc252941396d7db06ec7084e Mon Sep 17 00:00:00 2001 From: Robert Watson Date: Fri, 21 Jul 2006 17:11:15 +0000 Subject: Change semantics of socket close and detach. Add a new protocol switch function, pru_close, to notify protocols that the file descriptor or other consumer of a socket is closing the socket. pru_abort is now a notification of close also, and no longer detaches. pru_detach is no longer used to notify of close, and will be called during socket tear-down by sofree() when all references to a socket evaporate after an earlier call to abort or close the socket. This means detach is now an unconditional teardown of a socket, whereas previously sockets could persist after detach of the protocol retained a reference. This faciliates sharing mutexes between layers of the network stack as the mutex is required during the checking and removal of references at the head of sofree(). With this change, pru_detach can now assume that the mutex will no longer be required by the socket layer after completion, whereas before this was not necessarily true. Reviewed by: gnn --- sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h | 1 + sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h | 2 ++ sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h | 1 + sys/netgraph/bluetooth/socket/ng_btsocket.c | 4 ++++ sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c | 6 +++++- sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c | 9 ++++++++- sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c | 10 +++++++++- sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c | 11 +++++++++-- sys/netgraph/ng_socket.c | 4 ++++ 9 files changed, 43 insertions(+), 5 deletions(-) (limited to 'sys/netgraph') diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h b/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h index 0f2837770cb1..b8e98b31e694 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_hci_raw.h @@ -67,6 +67,7 @@ typedef struct ng_btsocket_hci_raw_pcb * ng_btsocket_hci_raw_pcb_p; void ng_btsocket_hci_raw_init (void); void ng_btsocket_hci_raw_abort (struct socket *); +void ng_btsocket_hci_raw_close (struct socket *); int ng_btsocket_hci_raw_attach (struct socket *, int, struct thread *); int ng_btsocket_hci_raw_bind (struct socket *, struct sockaddr *, struct thread *); diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h index a8523ab44f6b..deea5b3db0df 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_l2cap.h @@ -93,6 +93,7 @@ typedef struct ng_btsocket_l2cap_raw_pcb * ng_btsocket_l2cap_raw_pcb_p; void ng_btsocket_l2cap_raw_init (void); void ng_btsocket_l2cap_raw_abort (struct socket *); +void ng_btsocket_l2cap_raw_close (struct socket *); int ng_btsocket_l2cap_raw_attach (struct socket *, int, struct thread *); int ng_btsocket_l2cap_raw_bind (struct socket *, struct sockaddr *, struct thread *); @@ -184,6 +185,7 @@ typedef struct ng_btsocket_l2cap_pcb * ng_btsocket_l2cap_pcb_p; void ng_btsocket_l2cap_init (void); void ng_btsocket_l2cap_abort (struct socket *); +void ng_btsocket_l2cap_close (struct socket *); int ng_btsocket_l2cap_accept (struct socket *, struct sockaddr **); int ng_btsocket_l2cap_attach (struct socket *, int, struct thread *); int ng_btsocket_l2cap_bind (struct socket *, struct sockaddr *, diff --git a/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h b/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h index 1939964bbc76..a1fdb2717a13 100644 --- a/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h +++ b/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h @@ -315,6 +315,7 @@ typedef struct ng_btsocket_rfcomm_pcb * ng_btsocket_rfcomm_pcb_p; void ng_btsocket_rfcomm_init (void); void ng_btsocket_rfcomm_abort (struct socket *); +void ng_btsocket_rfcomm_close (struct socket *); int ng_btsocket_rfcomm_accept (struct socket *, struct sockaddr **); int ng_btsocket_rfcomm_attach (struct socket *, int, struct thread *); int ng_btsocket_rfcomm_bind (struct socket *, struct sockaddr *, diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket.c b/sys/netgraph/bluetooth/socket/ng_btsocket.c index 16b9a208e3d8..3029ffd4c187 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket.c @@ -74,6 +74,7 @@ static struct pr_usrreqs ng_btsocket_hci_raw_usrreqs = { .pru_send = ng_btsocket_hci_raw_send, .pru_shutdown = NULL, .pru_sockaddr = ng_btsocket_hci_raw_sockaddr, + .pru_close = ng_btsocket_hci_raw_close, }; /* @@ -92,6 +93,7 @@ static struct pr_usrreqs ng_btsocket_l2cap_raw_usrreqs = { .pru_send = ng_btsocket_l2cap_raw_send, .pru_shutdown = NULL, .pru_sockaddr = ng_btsocket_l2cap_raw_sockaddr, + .pru_close = ng_btsocket_l2cap_raw_close, }; /* @@ -112,6 +114,7 @@ static struct pr_usrreqs ng_btsocket_l2cap_usrreqs = { .pru_send = ng_btsocket_l2cap_send, .pru_shutdown = NULL, .pru_sockaddr = ng_btsocket_l2cap_sockaddr, + .pru_close = ng_btsocket_l2cap_close, }; /* @@ -132,6 +135,7 @@ static struct pr_usrreqs ng_btsocket_rfcomm_usrreqs = { .pru_send = ng_btsocket_rfcomm_send, .pru_shutdown = NULL, .pru_sockaddr = ng_btsocket_rfcomm_sockaddr, + .pru_close = ng_btsocket_rfcomm_close, }; /* diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c index 922184a25bf0..6513757181e1 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_hci_raw.c @@ -876,9 +876,13 @@ ng_btsocket_hci_raw_init(void) void ng_btsocket_hci_raw_abort(struct socket *so) { - ng_btsocket_hci_raw_detach(so); } /* ng_btsocket_hci_raw_abort */ +void +ng_btsocket_hci_raw_close(struct socket *so) +{ +} /* ng_btsocket_hci_raw_close */ + /* * Create new raw HCI socket */ diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c index 21d3766eb742..f6d6fb2b8456 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap.c @@ -1917,9 +1917,16 @@ ng_btsocket_l2cap_abort(struct socket *so) { so->so_error = ECONNABORTED; - ng_btsocket_l2cap_detach(so); + (void)ng_btsocket_l2cap_disconnect(so); } /* ng_btsocket_l2cap_abort */ +void +ng_btsocket_l2cap_close(struct socket *so) +{ + + (void)ng_btsocket_l2cap_disconnect(so); +} /* ng_btsocket_l2cap_close */ + /* * Accept connection on socket. Nothing to do here, socket must be connected * and ready, so just return peer address and be done with it. diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c index 85700f981c68..1bac6d916d55 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_l2cap_raw.c @@ -575,9 +575,17 @@ ng_btsocket_l2cap_raw_init(void) void ng_btsocket_l2cap_raw_abort(struct socket *so) { - ng_btsocket_l2cap_raw_detach(so); + + (void)ng_btsocket_l2cap_raw_disconnect(so); } /* ng_btsocket_l2cap_raw_abort */ +void +ng_btsocket_l2cap_raw_close(struct socket *so) +{ + + (void)ng_btsocket_l2cap_raw_disconnect(so); +} /* ng_btsocket_l2cap_raw_close */ + /* * Create and attach new socket */ diff --git a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c index 982705fbf7f0..4e599cf03281 100644 --- a/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c +++ b/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c @@ -346,11 +346,18 @@ ng_btsocket_rfcomm_init(void) void ng_btsocket_rfcomm_abort(struct socket *so) { - so->so_error = ECONNABORTED; - ng_btsocket_rfcomm_detach(so); + so->so_error = ECONNABORTED; + (void)ng_btsocket_rfcomm_disconnect(so); } /* ng_btsocket_rfcomm_abort */ +void +ng_btsocket_rfcomm_close(struct socket *so) +{ + + (void)ng_btsocket_rfcomm_disconnect(so); +} /* ng_btsocket_rfcomm_close */ + /* * Accept connection on socket. Nothing to do here, socket must be connected * and ready, so just return peer address and be done with it. diff --git a/sys/netgraph/ng_socket.c b/sys/netgraph/ng_socket.c index 72bff98f6da4..622973929cae 100644 --- a/sys/netgraph/ng_socket.c +++ b/sys/netgraph/ng_socket.c @@ -1087,6 +1087,8 @@ dummy_disconnect(struct socket *so) } /* * Control and data socket type descriptors + * + * XXXRW: Perhaps _close should do something? */ static struct pr_usrreqs ngc_usrreqs = { @@ -1100,6 +1102,7 @@ static struct pr_usrreqs ngc_usrreqs = { .pru_send = ngc_send, .pru_shutdown = NULL, .pru_sockaddr = ng_setsockaddr, + .pru_close = NULL, }; static struct pr_usrreqs ngd_usrreqs = { @@ -1113,6 +1116,7 @@ static struct pr_usrreqs ngd_usrreqs = { .pru_send = ngd_send, .pru_shutdown = NULL, .pru_sockaddr = ng_setsockaddr, + .pru_close = NULL, }; /* -- cgit v1.3