def handlePacket_NH(self, ad, data):
        # Broadcast: Node Status Hash (keep-alive)

        osm = self.main.osm

        def check_cb(src_n, src_ipp, rest):

            (pktnum, expire, infohash
             ) = self.decodePacket('!IH4s', rest)

            if not (5 <= expire <= 30*60):
                raise BadPacketError("Expire time out of range")

            # Make sure this isn't about me
            if self.isMyStatus(src_ipp, pktnum, sendfull=True):
                raise BadBroadcast("Impersonating me")

            if self.isOutdatedStatus(src_n, pktnum):
                raise BadBroadcast("Outdated")

            if osm.syncd:
                if src_n and src_n.infohash == infohash:
                    # We are syncd, and this node matches, so extend the
                    # expire timeout and keep forwarding.
                    src_n.status_pktnum = pktnum
                    osm.scheduleNodeExpire(src_n, expire + NODE_EXPIRE_EXTEND)
                    return

                else:
                    # Syncd, and we don't recognize it
                    raise Reject

            else:
                if not (src_n and src_n.expire_dcall):
                    # Not syncd, don't know enough about this node yet,
                    # so just forward blindly.
                    return

                elif src_n.infohash == infohash:
                    # We know about this node already, and the infohash
                    # matches, so extend timeout and keep forwarding
                    src_n.status_pktnum = pktnum
                    osm.scheduleNodeExpire(src_n, expire + NODE_EXPIRE_EXTEND)
                    return

                else:
                    # Not syncd, but we know the infohash is wrong.
                    raise Reject

        self.handleBroadcast(ad, data, check_cb)