diff options
Diffstat (limited to 'ot_udp.c')
| -rw-r--r-- | ot_udp.c | 26 |
1 files changed, 14 insertions, 12 deletions
| @@ -13,6 +13,7 @@ | |||
| 13 | /* Libowfat */ | 13 | /* Libowfat */ |
| 14 | #include "socket.h" | 14 | #include "socket.h" |
| 15 | #include "io.h" | 15 | #include "io.h" |
| 16 | #include "ip6.h" | ||
| 16 | 17 | ||
| 17 | /* Opentracker */ | 18 | /* Opentracker */ |
| 18 | #include "trackerlogic.h" | 19 | #include "trackerlogic.h" |
| @@ -73,7 +74,7 @@ int handle_udp6( int64 serversocket, struct ot_workstruct *ws ) { | |||
| 73 | ot_ip6 remoteip; | 74 | ot_ip6 remoteip; |
| 74 | uint32_t *inpacket = (uint32_t*)ws->inbuf; | 75 | uint32_t *inpacket = (uint32_t*)ws->inbuf; |
| 75 | uint32_t *outpacket = (uint32_t*)ws->outbuf; | 76 | uint32_t *outpacket = (uint32_t*)ws->outbuf; |
| 76 | uint32_t numwant, left, event, scopeid; | 77 | uint32_t left, event, scopeid; |
| 77 | uint32_t connid[2]; | 78 | uint32_t connid[2]; |
| 78 | uint32_t action; | 79 | uint32_t action; |
| 79 | uint16_t port, remoteport; | 80 | uint16_t port, remoteport; |
| @@ -141,34 +142,35 @@ int handle_udp6( int64 serversocket, struct ot_workstruct *ws ) { | |||
| 141 | /* We do only want to know, if it is zero */ | 142 | /* We do only want to know, if it is zero */ |
| 142 | left = inpacket[64/4] | inpacket[68/4]; | 143 | left = inpacket[64/4] | inpacket[68/4]; |
| 143 | 144 | ||
| 144 | /* Limit amount of peers to OT_MAX_PEERS_UDP */ | ||
| 145 | numwant = ntohl( inpacket[92/4] ); | ||
| 146 | if (numwant > OT_MAX_PEERS_UDP) numwant = OT_MAX_PEERS_UDP; | ||
| 147 | |||
| 148 | event = ntohl( inpacket[80/4] ); | 145 | event = ntohl( inpacket[80/4] ); |
| 149 | port = *(uint16_t*)( ((char*)inpacket) + 96 ); | 146 | port = *(uint16_t*)( ((char*)inpacket) + 96 ); |
| 150 | ws->hash = (ot_hash*)( ((char*)inpacket) + 16 ); | 147 | ws->hash = (ot_hash*)( ((char*)inpacket) + 16 ); |
| 151 | 148 | ||
| 152 | OT_SETIP( &ws->peer, remoteip ); | 149 | OT_SETIP( ws->peer, remoteip ); |
| 153 | OT_SETPORT( &ws->peer, &port ); | 150 | OT_SETPORT( ws->peer, &port ); |
| 154 | OT_PEERFLAG( &ws->peer ) = 0; | 151 | OT_PEERFLAG( ws->peer ) = 0; |
| 155 | 152 | ||
| 156 | switch( event ) { | 153 | switch( event ) { |
| 157 | case 1: OT_PEERFLAG( &ws->peer ) |= PEER_FLAG_COMPLETED; break; | 154 | case 1: OT_PEERFLAG( ws->peer ) |= PEER_FLAG_COMPLETED; break; |
| 158 | case 3: OT_PEERFLAG( &ws->peer ) |= PEER_FLAG_STOPPED; break; | 155 | case 3: OT_PEERFLAG( ws->peer ) |= PEER_FLAG_STOPPED; break; |
| 159 | default: break; | 156 | default: break; |
| 160 | } | 157 | } |
| 161 | 158 | ||
| 162 | if( !left ) | 159 | if( !left ) |
| 163 | OT_PEERFLAG( &ws->peer ) |= PEER_FLAG_SEEDING; | 160 | OT_PEERFLAG( ws->peer ) |= PEER_FLAG_SEEDING; |
| 164 | 161 | ||
| 165 | outpacket[0] = htonl( 1 ); /* announce action */ | 162 | outpacket[0] = htonl( 1 ); /* announce action */ |
| 166 | outpacket[1] = inpacket[12/4]; | 163 | outpacket[1] = inpacket[12/4]; |
| 167 | 164 | ||
| 168 | if( OT_PEERFLAG( &ws->peer ) & PEER_FLAG_STOPPED ) { /* Peer is gone. */ | 165 | if( OT_PEERFLAG( ws->peer ) & PEER_FLAG_STOPPED ) { /* Peer is gone. */ |
| 169 | ws->reply = ws->outbuf; | 166 | ws->reply = ws->outbuf; |
| 170 | ws->reply_size = remove_peer_from_torrent( FLAG_UDP, ws ); | 167 | ws->reply_size = remove_peer_from_torrent( FLAG_UDP, ws ); |
| 171 | } else { | 168 | } else { |
| 169 | /* Limit amount of peers to OT_MAX_PEERS_UDP */ | ||
| 170 | uint32_t numwant = ntohl( inpacket[92/4] ); | ||
| 171 | size_t max_peers = ip6_isv4mapped(remoteip) ? OT_MAX_PEERS_UDP4 : OT_MAX_PEERS_UDP6; | ||
| 172 | if (numwant > max_peers) numwant = max_peers; | ||
| 173 | |||
| 172 | ws->reply = ws->outbuf + 8; | 174 | ws->reply = ws->outbuf + 8; |
| 173 | ws->reply_size = 8 + add_peer_to_torrent_and_return_peers( FLAG_UDP, ws, numwant ); | 175 | ws->reply_size = 8 + add_peer_to_torrent_and_return_peers( FLAG_UDP, ws, numwant ); |
| 174 | } | 176 | } |
