| 28 | } |
| 29 | |
| 30 | enum fromwireaddr_ret fromwire_wireaddr(const u8 **cursor, size_t *max, struct wireaddr *addr) |
| 31 | { |
| 32 | addr->type = fromwire_u8(cursor, max); |
| 33 | if (*cursor == NULL) |
| 34 | return FROMWIREADDR_MALFORMED; |
| 35 | |
| 36 | switch (addr->type) { |
| 37 | case ADDR_TYPE_IPV4: |
| 38 | addr->addrlen = 4; |
| 39 | break; |
| 40 | case ADDR_TYPE_IPV6: |
| 41 | addr->addrlen = 16; |
| 42 | break; |
| 43 | case ADDR_TYPE_TOR_V2_REMOVED: |
| 44 | addr->addrlen = TOR_V2_ADDRLEN; |
| 45 | break; |
| 46 | case ADDR_TYPE_TOR_V3: |
| 47 | addr->addrlen = TOR_V3_ADDRLEN; |
| 48 | break; |
| 49 | case ADDR_TYPE_DNS: |
| 50 | addr->addrlen = fromwire_u8(cursor, max); |
| 51 | memset(&addr->addr, 0, sizeof(addr->addr)); |
| 52 | break; |
| 53 | default: |
| 54 | return FROMWIREADDR_UNKNOWN; |
| 55 | } |
| 56 | fromwire(cursor, max, addr->addr, addr->addrlen); |
| 57 | addr->port = fromwire_u16(cursor, max); |
| 58 | |
| 59 | if (*cursor == NULL) |
| 60 | return FROMWIREADDR_MALFORMED; |
| 61 | /* BOLT #7: |
| 62 | * - if `port` is equal to 0: |
| 63 | * - SHOULD ignore `ipv6_addr` OR `ipv4_addr` OR `hostname`. |
| 64 | */ |
| 65 | /* FIXME: This seems universal? */ |
| 66 | if (addr->port == 0) |
| 67 | return FROMWIREADDR_IGNORE; |
| 68 | return FROMWIREADDR_OK; |
| 69 | } |
| 70 | |
| 71 | void towire_wireaddr(u8 **pptr, const struct wireaddr *addr) |
| 72 | { |