version 1.106, 2008/04/23 06:09:04 |
version 1.107.4.1, 2008/09/18 04:37:01 |
Line 380 rip_output(struct mbuf *m, ...) |
|
Line 380 rip_output(struct mbuf *m, ...) |
|
* Raw IP socket option processing. |
* Raw IP socket option processing. |
*/ |
*/ |
int |
int |
rip_ctloutput(int op, struct socket *so, int level, int optname, |
rip_ctloutput(int op, struct socket *so, struct sockopt *sopt) |
struct mbuf **m) |
|
{ |
{ |
struct inpcb *inp = sotoinpcb(so); |
struct inpcb *inp = sotoinpcb(so); |
int error = 0; |
int error = 0; |
|
int optval; |
|
|
if (level == SOL_SOCKET && optname == SO_NOHEADER) { |
if (sopt->sopt_level == SOL_SOCKET && sopt->sopt_name == SO_NOHEADER) { |
if (op == PRCO_GETOPT) { |
if (op == PRCO_GETOPT) { |
*m = m_intopt(so, |
optval = (inp->inp_flags & INP_NOHEADER) ? 1 : 0; |
(inp->inp_flags & INP_NOHEADER) ? 1 : 0); |
error = sockopt_set(sopt, &optval, sizeof(optval)); |
return 0; |
} else if (op == PRCO_SETOPT) { |
} else if (*m == NULL || (*m)->m_len != sizeof(int)) |
error = sockopt_getint(sopt, &optval); |
error = EINVAL; |
if (error) |
else if (*mtod(*m, int *)) { |
goto out; |
inp->inp_flags &= ~INP_HDRINCL; |
if (optval) { |
inp->inp_flags |= INP_NOHEADER; |
inp->inp_flags &= ~INP_HDRINCL; |
} else |
inp->inp_flags |= INP_NOHEADER; |
inp->inp_flags &= ~INP_NOHEADER; |
} else |
goto free_m; |
inp->inp_flags &= ~INP_NOHEADER; |
} else if (level != IPPROTO_IP) |
} |
return ip_ctloutput(op, so, level, optname, m); |
goto out; |
|
} else if (sopt->sopt_level != IPPROTO_IP) |
|
return ip_ctloutput(op, so, sopt); |
|
|
switch (op) { |
switch (op) { |
|
|
case PRCO_SETOPT: |
case PRCO_SETOPT: |
switch (optname) { |
switch (sopt->sopt_name) { |
case IP_HDRINCL: |
case IP_HDRINCL: |
if (*m == NULL || (*m)->m_len != sizeof(int)) |
error = sockopt_getint(sopt, &optval); |
error = EINVAL; |
if (error) |
else if (*mtod(*m, int *)) |
break; |
|
if (optval) |
inp->inp_flags |= INP_HDRINCL; |
inp->inp_flags |= INP_HDRINCL; |
else |
else |
inp->inp_flags &= ~INP_HDRINCL; |
inp->inp_flags &= ~INP_HDRINCL; |
goto free_m; |
break; |
|
|
#ifdef MROUTING |
#ifdef MROUTING |
case MRT_INIT: |
case MRT_INIT: |
Line 426 rip_ctloutput(int op, struct socket *so, |
|
Line 429 rip_ctloutput(int op, struct socket *so, |
|
case MRT_API_CONFIG: |
case MRT_API_CONFIG: |
case MRT_ADD_BW_UPCALL: |
case MRT_ADD_BW_UPCALL: |
case MRT_DEL_BW_UPCALL: |
case MRT_DEL_BW_UPCALL: |
error = ip_mrouter_set(so, optname, m); |
error = ip_mrouter_set(so, sopt); |
break; |
break; |
#endif |
#endif |
|
|
default: |
default: |
error = ip_ctloutput(op, so, level, optname, m); |
error = ip_ctloutput(op, so, sopt); |
break; |
break; |
} |
} |
break; |
break; |
|
|
case PRCO_GETOPT: |
case PRCO_GETOPT: |
switch (optname) { |
switch (sopt->sopt_name) { |
case IP_HDRINCL: |
case IP_HDRINCL: |
*m = m_intopt(so, inp->inp_flags & INP_HDRINCL ? 1 : 0); |
optval = inp->inp_flags & INP_HDRINCL; |
|
error = sockopt_set(sopt, &optval, sizeof(optval)); |
break; |
break; |
|
|
#ifdef MROUTING |
#ifdef MROUTING |
Line 447 rip_ctloutput(int op, struct socket *so, |
|
Line 451 rip_ctloutput(int op, struct socket *so, |
|
case MRT_ASSERT: |
case MRT_ASSERT: |
case MRT_API_SUPPORT: |
case MRT_API_SUPPORT: |
case MRT_API_CONFIG: |
case MRT_API_CONFIG: |
error = ip_mrouter_get(so, optname, m); |
error = ip_mrouter_get(so, sopt); |
break; |
break; |
#endif |
#endif |
|
|
default: |
default: |
error = ip_ctloutput(op, so, level, optname, m); |
error = ip_ctloutput(op, so, sopt); |
break; |
break; |
} |
} |
break; |
break; |
} |
} |
return error; |
out: |
free_m: |
|
if (op == PRCO_SETOPT && *m != NULL) |
|
(void)m_free(*m); |
|
return error; |
return error; |
} |
} |
|
|
Line 528 rip_usrreq(struct socket *so, int req, |
|
Line 529 rip_usrreq(struct socket *so, int req, |
|
s = splsoftnet(); |
s = splsoftnet(); |
|
|
if (req == PRU_PURGEIF) { |
if (req == PRU_PURGEIF) { |
|
mutex_enter(softnet_lock); |
in_pcbpurgeif0(&rawcbtable, (struct ifnet *)control); |
in_pcbpurgeif0(&rawcbtable, (struct ifnet *)control); |
in_purgeif((struct ifnet *)control); |
in_purgeif((struct ifnet *)control); |
in_pcbpurgeif(&rawcbtable, (struct ifnet *)control); |
in_pcbpurgeif(&rawcbtable, (struct ifnet *)control); |
|
mutex_exit(softnet_lock); |
splx(s); |
splx(s); |
return (0); |
return (0); |
} |
} |
Line 548 rip_usrreq(struct socket *so, int req, |
|
Line 551 rip_usrreq(struct socket *so, int req, |
|
switch (req) { |
switch (req) { |
|
|
case PRU_ATTACH: |
case PRU_ATTACH: |
|
sosetlock(so); |
if (inp != 0) { |
if (inp != 0) { |
error = EISCONN; |
error = EISCONN; |
break; |
break; |