version 1.38, 2018/03/08 07:06:13 |
version 1.39, 2018/03/08 07:54:14 |
Line 229 npf_fetch_tcpopts(npf_cache_t *npc, uint |
|
Line 229 npf_fetch_tcpopts(npf_cache_t *npc, uint |
|
nbuf_t *nbuf = npc->npc_nbuf; |
nbuf_t *nbuf = npc->npc_nbuf; |
const struct tcphdr *th = npc->npc_l4.tcp; |
const struct tcphdr *th = npc->npc_l4.tcp; |
int topts_len, step; |
int topts_len, step; |
void *nptr; |
uint8_t *nptr; |
uint8_t val; |
uint8_t val; |
bool ok; |
bool ok; |
|
|
|
|
ok = false; |
ok = false; |
goto done; |
goto done; |
} |
} |
val = *(uint8_t *)nptr; |
val = *nptr; |
|
|
switch (val) { |
switch (val) { |
case TCPOPT_EOL: |
case TCPOPT_EOL: |
|
|
step = 1; |
step = 1; |
break; |
break; |
case TCPOPT_MAXSEG: |
case TCPOPT_MAXSEG: |
if ((nptr = nbuf_advance(nbuf, 2, 2)) == NULL) { |
if ((nptr = nbuf_ensure_contig(nbuf, TCPOLEN_MAXSEG)) == NULL) { |
ok = false; |
ok = false; |
goto done; |
goto done; |
} |
} |
if (mss) { |
if (mss) { |
if (*mss) { |
if (*mss) { |
memcpy(nptr, mss, sizeof(uint16_t)); |
memcpy(nptr + 2, mss, sizeof(uint16_t)); |
} else { |
} else { |
memcpy(mss, nptr, sizeof(uint16_t)); |
memcpy(mss, nptr + 2, sizeof(uint16_t)); |
} |
} |
} |
} |
topts_len -= TCPOLEN_MAXSEG; |
topts_len -= TCPOLEN_MAXSEG; |
step = 2; |
step = TCPOLEN_MAXSEG; |
break; |
break; |
case TCPOPT_WINDOW: |
case TCPOPT_WINDOW: |
/* TCP Window Scaling (RFC 1323). */ |
/* TCP Window Scaling (RFC 1323). */ |
if ((nptr = nbuf_advance(nbuf, 2, 1)) == NULL) { |
if ((nptr = nbuf_ensure_contig(nbuf, TCPOLEN_WINDOW)) == NULL) { |
ok = false; |
ok = false; |
goto done; |
goto done; |
} |
} |
val = *(uint8_t *)nptr; |
val = *(nptr + 2); |
*wscale = (val > TCP_MAX_WINSHIFT) ? TCP_MAX_WINSHIFT : val; |
*wscale = (val > TCP_MAX_WINSHIFT) ? TCP_MAX_WINSHIFT : val; |
topts_len -= TCPOLEN_WINDOW; |
topts_len -= TCPOLEN_WINDOW; |
step = 1; |
step = TCPOLEN_WINDOW; |
break; |
break; |
default: |
default: |
if ((nptr = nbuf_advance(nbuf, 1, 1)) == NULL) { |
if ((nptr = nbuf_ensure_contig(nbuf, 2)) == NULL) { |
ok = false; |
ok = false; |
goto done; |
goto done; |
} |
} |
val = *(uint8_t *)nptr; |
val = *(nptr + 1); |
if (val < 2 || val > topts_len) { |
if (val < 2 || val > topts_len) { |
ok = false; |
ok = false; |
goto done; |
goto done; |
} |
} |
topts_len -= val; |
topts_len -= val; |
step = val - 1; |
step = val; |
} |
} |
|
|
/* Any options left? */ |
/* Any options left? */ |