Changeset View
Changeset View
Standalone View
Standalone View
sys/net/rtsock.c
| Show First 20 Lines • Show All 417 Lines • ▼ Show 20 Lines | rts_attach(struct socket *so, int proto, struct thread *td) | ||||
| } | } | ||||
| V_route_cb.any_count++; | V_route_cb.any_count++; | ||||
| RTSOCK_UNLOCK(); | RTSOCK_UNLOCK(); | ||||
| soisconnected(so); | soisconnected(so); | ||||
| return (0); | return (0); | ||||
| } | } | ||||
| static int | |||||
| rts_ctloutput(struct socket *so, struct sockopt *sopt) | |||||
| { | |||||
| int error, optval; | |||||
| error = ENOPROTOOPT; | |||||
| if (sopt->sopt_dir == SOPT_SET) { | |||||
| switch (sopt->sopt_level) { | |||||
| case SOL_SOCKET: | |||||
| switch (sopt->sopt_name) { | |||||
| case SO_SETFIB: | |||||
| error = sooptcopyin(sopt, &optval, | |||||
| sizeof(optval), sizeof(optval)); | |||||
| if (error != 0) | |||||
| break; | |||||
| error = sosetfib(so, optval); | |||||
| break; | |||||
| } | |||||
| break; | |||||
| } | |||||
| } | |||||
| return (error); | |||||
| } | |||||
| static void | static void | ||||
| rts_detach(struct socket *so) | rts_detach(struct socket *so) | ||||
| { | { | ||||
| struct rcb *rcb = so->so_pcb; | struct rcb *rcb = so->so_pcb; | ||||
| RTSOCK_LOCK(); | RTSOCK_LOCK(); | ||||
| LIST_REMOVE(rcb, list); | LIST_REMOVE(rcb, list); | ||||
| switch(rcb->rcb_family) { | switch(rcb->rcb_family) { | ||||
| ▲ Show 20 Lines • Show All 2,263 Lines • ▼ Show 20 Lines | |||||
| static struct domain routedomain; /* or at least forward */ | static struct domain routedomain; /* or at least forward */ | ||||
| static struct protosw routesw = { | static struct protosw routesw = { | ||||
| .pr_type = SOCK_RAW, | .pr_type = SOCK_RAW, | ||||
| .pr_flags = PR_ATOMIC|PR_ADDR, | .pr_flags = PR_ATOMIC|PR_ADDR, | ||||
| .pr_abort = rts_close, | .pr_abort = rts_close, | ||||
| .pr_attach = rts_attach, | .pr_attach = rts_attach, | ||||
| .pr_ctloutput = rts_ctloutput, | |||||
| .pr_detach = rts_detach, | .pr_detach = rts_detach, | ||||
| .pr_send = rts_send, | .pr_send = rts_send, | ||||
| .pr_shutdown = rts_shutdown, | .pr_shutdown = rts_shutdown, | ||||
| .pr_disconnect = rts_disconnect, | .pr_disconnect = rts_disconnect, | ||||
| .pr_close = rts_close, | .pr_close = rts_close, | ||||
| }; | }; | ||||
| static struct domain routedomain = { | static struct domain routedomain = { | ||||
| .dom_family = PF_ROUTE, | .dom_family = PF_ROUTE, | ||||
| .dom_name = "route", | .dom_name = "route", | ||||
| .dom_nprotosw = 1, | .dom_nprotosw = 1, | ||||
| .dom_protosw = { &routesw }, | .dom_protosw = { &routesw }, | ||||
| }; | }; | ||||
| DOMAIN_SET(route); | DOMAIN_SET(route); | ||||