|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ( conf->debug ) printf("remoteidlen=%i\n",remoteidlen); |
|
|
|
|
|
|
|
|
if ( remoteidlen>0 ) { |
|
|
if ( remoteidlen>0 ) { |
|
|
if ( conf->debug ) { |
|
|
if ( conf->debug ) { |
|
|
int i; |
|
|
int i; |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void dp_dhcpv6_check(dp_conf *conf, unsigned char *pkt, int pktlen, int offset, unsigned char **remoteid, int *remoteidlen) { |
|
|
void dp_dhcpv6_check(dp_conf *conf, unsigned char *pkt, int pktlen, int offset, unsigned char **remoteid, int *remoteidlen) { |
|
|
|
|
|
uint8_t msgtype = (uint8_t)pkt[offset]; |
|
|
|
|
|
|
|
|
while(offset<pktlen) { |
|
|
|
|
|
uint8_t msgtype = (uint8_t)pkt[offset]; |
|
|
|
|
|
|
|
|
if ( conf->debug ) printf("offset=%i\n",offset); |
|
|
|
|
|
|
|
|
switch(msgtype) { |
|
|
|
|
|
case 11: // RELAY-FORW |
|
|
|
|
|
case 12: // RELAY-REPL |
|
|
|
|
|
offset += 2 + 16 + 16; // msg-type, hop-count, link-addr, peer-addr |
|
|
|
|
|
break; |
|
|
|
|
|
default: // all other msgtypes |
|
|
|
|
|
offset += 2; // msg-type, hop-count |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
switch(msgtype) { |
|
|
|
|
|
case 12: // RELAY-FORW |
|
|
|
|
|
case 13: // RELAY-REPL |
|
|
|
|
|
offset += 2 + 16 + 16; // msg-type, hop-count, link-addr, peer-addr |
|
|
|
|
|
if ( conf->debug ) printf("this is a relay msg\n"); |
|
|
|
|
|
break; |
|
|
|
|
|
default: // all other msgtypes |
|
|
|
|
|
offset += 2; // msg-type, hop-count |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
while(offset+4<=pktlen) { |
|
|
|
|
|
uint16_t code = ntohs((uint16_t)pkt[offset]); |
|
|
|
|
|
uint16_t len = ntohs((uint16_t)pkt[offset+2]); |
|
|
|
|
|
|
|
|
if ( conf->debug ) printf("offset=%i\n",offset); |
|
|
|
|
|
|
|
|
offset+=4; |
|
|
|
|
|
|
|
|
while(offset+4<=pktlen) { |
|
|
|
|
|
uint16_t code = ntohs(*(uint16_t*)(pkt+offset)); |
|
|
|
|
|
uint16_t len = ntohs(*(uint16_t*)(pkt+offset+2)); |
|
|
|
|
|
|
|
|
if ( code == 9 ) { // relay message |
|
|
|
|
|
offset += 4; |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if ( conf->debug ) printf("code %i len %i\n", code, len); |
|
|
|
|
|
|
|
|
if ( code == 1 ) { // Client identifier / DUID |
|
|
|
|
|
// make sure there's enough space |
|
|
|
|
|
if ( offset + len <= pktlen ) { |
|
|
|
|
|
*remoteid = pkt+offset; |
|
|
|
|
|
*remoteidlen = len; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
offset+=len; |
|
|
|
|
|
|
|
|
offset+=4; |
|
|
|
|
|
|
|
|
|
|
|
if ( code == 9 ) { // relay message |
|
|
|
|
|
if ( conf->debug ) printf("option 9, relay msg\n"); |
|
|
|
|
|
offset+=4; |
|
|
|
|
|
continue; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if ( *remoteidlen>0 ) |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
if ( code == 1 ) { // Client identifier / DUID |
|
|
|
|
|
// make sure there's enough space |
|
|
|
|
|
if ( offset + len <= pktlen ) { |
|
|
|
|
|
*remoteid = pkt+offset; |
|
|
|
|
|
*remoteidlen = len; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
offset+=len; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|