| version 1.30, 1996/05/28 23:27:04 |
version 1.31, 1996/06/23 12:12:49 |
| Line 206 rip_ctloutput(op, so, level, optname, m) |
|
| Line 206 rip_ctloutput(op, so, level, optname, m) |
|
| struct mbuf **m; |
struct mbuf **m; |
| { |
{ |
| register struct inpcb *inp = sotoinpcb(so); |
register struct inpcb *inp = sotoinpcb(so); |
| #ifdef MROUTING |
int error = 0; |
| int error; |
|
| #endif |
|
| |
|
| if (level != IPPROTO_IP) { |
if (level != IPPROTO_IP) { |
| if (m != 0 && *m != 0) |
error = ENOPROTOOPT; |
| (void)m_free(*m); |
if (op == PRCO_SETOPT && *m != 0) |
| return (EINVAL); |
(void) m_free(*m); |
| } |
} else switch (op) { |
| |
|
| switch (optname) { |
case PRCO_SETOPT: |
| |
switch (optname) { |
| case IP_HDRINCL: |
case IP_HDRINCL: |
| if (op == PRCO_SETOPT || op == PRCO_GETOPT) { |
if (*m == 0 || (*m)->m_len < sizeof (int)) |
| if (m == 0 || *m == 0 || (*m)->m_len < sizeof (int)) |
error = EINVAL; |
| return (EINVAL); |
else { |
| if (op == PRCO_SETOPT) { |
|
| if (*mtod(*m, int *)) |
if (*mtod(*m, int *)) |
| inp->inp_flags |= INP_HDRINCL; |
inp->inp_flags |= INP_HDRINCL; |
| else |
else |
| inp->inp_flags &= ~INP_HDRINCL; |
inp->inp_flags &= ~INP_HDRINCL; |
| (void)m_free(*m); |
|
| } else { |
|
| (*m)->m_len = sizeof (int); |
|
| *mtod(*m, int *) = inp->inp_flags & INP_HDRINCL; |
|
| } |
} |
| return (0); |
if (*m != 0) |
| |
(void) m_free(*m); |
| |
break; |
| |
|
| |
#ifdef MROUTING |
| |
case MRT_INIT: |
| |
case MRT_DONE: |
| |
case MRT_ADD_VIF: |
| |
case MRT_DEL_VIF: |
| |
case MRT_ADD_MFC: |
| |
case MRT_DEL_MFC: |
| |
case MRT_ASSERT: |
| |
error = ip_mrouter_set(so, optname, m); |
| |
break; |
| |
#endif |
| |
|
| |
default: |
| |
error = ip_ctloutput(op, so, level, optname, m); |
| |
break; |
| } |
} |
| break; |
break; |
| |
|
| case MRT_INIT: |
case PRCO_GETOPT: |
| case MRT_DONE: |
switch (optname) { |
| case MRT_ADD_VIF: |
case IP_HDRINCL: |
| case MRT_DEL_VIF: |
*m = m_get(M_WAIT, M_SOOPTS); |
| case MRT_ADD_MFC: |
(*m)->m_len = sizeof (int); |
| case MRT_DEL_MFC: |
*mtod(*m, int *) = inp->inp_flags & INP_HDRINCL ? 1 : 0; |
| case MRT_VERSION: |
|
| case MRT_ASSERT: |
|
| #ifdef MROUTING |
|
| switch (op) { |
|
| case PRCO_SETOPT: |
|
| error = ip_mrouter_set(optname, so, m); |
|
| break; |
break; |
| case PRCO_GETOPT: |
|
| error = ip_mrouter_get(optname, so, m); |
#ifdef MROUTING |
| |
case MRT_VERSION: |
| |
case MRT_ASSERT: |
| |
error = ip_mrouter_get(so, optname, m); |
| break; |
break; |
| |
#endif |
| |
|
| default: |
default: |
| error = EINVAL; |
error = ip_ctloutput(op, so, level, optname, m); |
| break; |
break; |
| } |
} |
| return (error); |
break; |
| #else |
|
| if (op == PRCO_SETOPT && *m) |
|
| m_free(*m); |
|
| return (EOPNOTSUPP); |
|
| #endif |
|
| } |
} |
| return (ip_ctloutput(op, so, level, optname, m)); |
return (error); |
| } |
} |
| |
|
| int |
int |