Re: How to find a certain socket?




On Wed, 20 Sep 2006, Taras Danko wrote:

I need to find and close a certain socket from kernel module. My current implementation iterates over the "allproc" list and checks every process' file descriptors list to find needed socket. But maybe there is an easier way to do this? Some nixes have "inpcbtable" which holds all the open sockets on the system. Is there anything similar in FreeBSD?

What are you trying to do, exactly?

The semantics of closing sockets open in processes are a bit tricky -- first off, you really don't want to actually close the file descriptor, as the application may misbehave in rather unfortunate ways, such as writing data to the wrong files, etc. So in that sense, what you're doing is better than actually closing the file descriptor, which would cause that to happen. If you're interested only in closing TCP sockets, then the existing tcpkill command may well do what you want.

And the second question: whats the correct way to close the socket which was found?

I'm not sure there's really a "correct" way to go about ripping a socket out from under an application. tcpkill does the next closest thing, which is to simulate a RST on the TCP connection and force it to close, which is propagated up the stack in a way the application will understand.

Robert N M Watson
Computer Laboratory
University of Cambridge



My implementation:

.....
mysocket = myproc->p_fd->fd_ofiles[i]->f_data;
myproc->p_fd->fd_ofiles[i]->f_data = NULL;
myproc->p_fd->fd_ofiles[i]->f_ops = &badfileops;
soclose(mysocket);
.....

The socket closes but it causes a kernel panic in 90% of cases and
file descriptor doesnt actualy released (as fstat shows), but is
marked as "error" (because of "badfileops" I suppose). Maybe I should
acqure some mutex lock or something before starting manipulations with
socket? Any exampe code will be very much appreciated.

Its my first steps in fbsd kernel programming so please xcuse me for
newbie questions.

Taras Danko.
- - - - - - - - - - - - - - - - - - - - - -
contact me:
email: gortaur@xxxxxxxxx
icq: 166956956
_______________________________________________
freebsd-hackers@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@xxxxxxxxxxx"

_______________________________________________
freebsd-hackers@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@xxxxxxxxxxx"



Relevant Pages

  • Re: given an fd, how to tell if its open?
    ... Your process may inherit open fd's from a parent ... like a socket. ... start any new Applix sessions - disastrous with over 400 users over ... up on a consistent file descriptor. ...
    (comp.unix.programmer)
  • Re: send file descriptor via ipc
    ... numbers into 'struct file' references. ... buffer for the remote socket. ... them into the file descriptor array of the receiving process. ... descriptors that are referenced only by disconnected UNIX domain sockets ...
    (freebsd-hackers)
  • Re: Proposal: a revoke() system call
    ... You could achieve something of the same end by opening /dev/null and then dup2'ing to the file descriptor you want to revoke, ... Right now there's a known issue that calling closeon a socket from one thread doesn't interrupt a socket in a blocking I/O call from another thread -- you first have to call shutdown, ... Another example of a "reader thread" would be ... the main thread of a daemon that accepts the incoming connections ...
    (freebsd-arch)
  • Re: When can an FD become invalid?
    ... closing some other socket but the descriptor was reused. ... the variable that holds the file descriptor and closing the file descriptor ...
    (comp.os.linux.development.apps)
  • Re: Problem with select() operation...
    ... Is sckt the file descriptor added to the tested ... If this is a TCP socket, ... Append_Circbuf(cbuf, resp); ... out on the selectcommand. ...
    (comp.os.vxworks)