version 1.107, 2008/04/24 11:38:38 |
version 1.108, 2008/08/06 15:01:23 |
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; |
} |
} |
|
|