diff options
Diffstat (limited to 'modules/gzrtp/stream.h')
-rw-r--r-- | modules/gzrtp/stream.h | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/modules/gzrtp/stream.h b/modules/gzrtp/stream.h new file mode 100644 index 0000000..4f2f987 --- /dev/null +++ b/modules/gzrtp/stream.h @@ -0,0 +1,139 @@ +/** + * @file stream.h GNU ZRTP: Stream class + * + * Copyright (C) 2010 - 2017 Creytiv.com + */ +#ifndef __STREAM_H +#define __STREAM_H + + +#include <libzrtpcpp/ZRtp.h> + + +enum StreamMediaType { + MT_UNKNOWN = 0, + MT_AUDIO, + MT_VIDEO, + MT_TEXT, + MT_APPLICATION, + MT_MESSAGE +}; + + +class ZRTPConfig { +public: + ZRTPConfig(const struct conf *conf, const char *conf_dir); +private: + friend class Stream; + friend class Session; + + ZrtpConfigure zrtp; + + char client_id[CLIENT_ID_SIZE + 1]; + char zid_filename[256]; + + bool start_parallel; +}; + + +class Stream; + +class SRTPStat { +public: + SRTPStat(const Stream *st, bool srtcp, uint64_t threshold); + void update(int32_t ret_code, bool quiet = false); + void reset(); + uint64_t ok() { return m_ok; } +private: + const Stream *m_stream; + const bool m_control; + const uint64_t m_threshold; + uint64_t m_ok, m_decode, m_auth, m_replay; + uint64_t m_decode_burst, m_auth_burst, m_replay_burst; +}; + + +class Session; +class CryptoContext; +class CryptoContextCtrl; + +class Stream : public ZrtpCallback { +public: + Stream(int& err, const ZRTPConfig& config, Session *session, + udp_sock *rtpsock, udp_sock *rtcpsock, + uint32_t local_ssrc, StreamMediaType media_type); + + virtual ~Stream(); + + int start(Stream *master); + void stop(); + bool started() { return m_started; } + + int sdp_encode(struct sdp_media *sdpm); + int sdp_decode(const struct sdp_media *sdpm); + + const char *media_name() const; + + const char *get_sas() const { return m_sas.c_str(); } + const char *get_ciphers() const { return m_ciphers.c_str(); } + bool sas_verified(); + void verify_sas(bool verify); + +private: + static void zrtp_timer_cb(void *arg); + static bool udp_helper_send_cb(int *err, struct sa *src, + struct mbuf *mb, void *arg); + static bool udp_helper_recv_cb(struct sa *src, struct mbuf *mb, + void *arg); + + bool udp_helper_send(int *err, struct sa *src, struct mbuf *mb); + bool udp_helper_recv(struct sa *src, struct mbuf *mb); + bool recv_zrtp(struct mbuf *mb); + + void print_message(GnuZrtpCodes::MessageSeverity severity, + int32_t subcode); + + Session *m_session; + ZRtp *m_zrtp; + bool m_started; + struct tmr m_zrtp_timer; + pthread_mutex_t m_zrtp_mutex; + uint16_t m_zrtp_seq; + uint32_t m_local_ssrc, m_peer_ssrc; + struct sa m_raddr; + struct udp_sock *m_rtpsock, *m_rtcpsock; + struct udp_helper *m_uh_rtp; + struct udp_helper *m_uh_rtcp; + StreamMediaType m_media_type; + CryptoContext *m_send_cc, *m_recv_cc; + CryptoContextCtrl *m_send_cc_ctrl, *m_recv_cc_ctrl; + SRTPStat m_srtp_stat, m_srtcp_stat; + std::string m_sas, m_ciphers; + +protected: + virtual int32_t sendDataZRTP(const uint8_t* data, int32_t length); + virtual int32_t activateTimer(int32_t time); + virtual int32_t cancelTimer(); + virtual void sendInfo(GnuZrtpCodes::MessageSeverity severity, + int32_t subCode); + virtual bool srtpSecretsReady(SrtpSecret_t* secrets, + EnableSecurity part); + virtual void srtpSecretsOff(EnableSecurity part); + virtual void srtpSecretsOn(std::string c, std::string s, + bool verified); + virtual void handleGoClear(); + virtual void zrtpNegotiationFailed( + GnuZrtpCodes::MessageSeverity severity, + int32_t subCode); + virtual void zrtpNotSuppOther(); + virtual void synchEnter(); + virtual void synchLeave(); + virtual void zrtpAskEnrollment(GnuZrtpCodes::InfoEnrollment info); + virtual void zrtpInformEnrollment(GnuZrtpCodes::InfoEnrollment info); + virtual void signSAS(uint8_t* sasHash); + virtual bool checkSASSignature(uint8_t* sasHash); +}; + + +#endif // __STREAM_H + |