diff --git a/examples/espidf-coap-server/sdkconfig.defaults b/examples/espidf-coap-server/sdkconfig.defaults index 19e6d67..308ca1c 100644 --- a/examples/espidf-coap-server/sdkconfig.defaults +++ b/examples/espidf-coap-server/sdkconfig.defaults @@ -1,5 +1,4 @@ -CONFIG_EXAMPLE_WIFI_SSID="MYSSID" -CONFIG_EXAMPLE_WIFI_PASSWORD="MYPASS" CONFIG_MBEDTLS_SSL_PROTO_DTLS=y CONFIG_MBEDTLS_PSK_MODES=y CONFIG_MBEDTLS_KEY_EXCHANGE_PSK=y +CONFIG_LWIP_NETBUF_RECVINFO=y diff --git a/examples/espidf-coap-server/src/Kconfig.projbuild b/examples/espidf-coap-server/src/Kconfig.projbuild index 19da816..3c0fbfc 100644 --- a/examples/espidf-coap-server/src/Kconfig.projbuild +++ b/examples/espidf-coap-server/src/Kconfig.projbuild @@ -8,4 +8,54 @@ menu "Example CoAP Server Configuration" The Preshared Key to use to encrypt the communicatons. The same key must be used at both ends of the CoAP connection, and the CoaP client must request an URI prefixed with coaps:// instead of coap:// for DTLS to be used. + + choice EXAMPLE_COAP_MCAST_IP_MODE + prompt "Receive Multicast IP type" + help + Example can receive multicast IPV4, IPV6, both or none. + + config EXAMPLE_COAP_MCAST_NONE + bool "None" + + config EXAMPLE_COAP_MCAST_IPV4_V6 + bool "IPV4 & IPV6" + select EXAMPLE_COAP_MCAST_IPV4 + select EXAMPLE_COAP_MCAST_IPV6 + + config EXAMPLE_COAP_MCAST_IPV4_ONLY + bool "IPV4" + select EXAMPLE_COAP_MCAST_IPV4 + + config EXAMPLE_COAP_MCAST_IPV6_ONLY + bool "IPV6" + select EXAMPLE_COAP_MCAST_IPV6 + + endchoice + + config EXAMPLE_COAP_MCAST_IPV4 + bool + config EXAMPLE_COAP_MCAST_IPV6 + bool + select EXAMPLE_CONNECT_IPV6 if IDF_TARGET_ESP32 + + config EXAMPLE_COAP_MULTICAST_IPV4_ADDR + string "CoAP Multicast IPV4 Address (receive)" + default "224.0.1.187" + depends on EXAMPLE_COAP_MCAST_IPV4 + help + IPV4 multicast address to receive multicast traffic on. + + The default CoAP IPV4 address is 224.0.1.187. + + config EXAMPLE_COAP_MULTICAST_IPV6_ADDR + string "CoAP Multicast IPV6 Address (receive)" + default "FF02::FD" + depends on EXAMPLE_COAP_MCAST_IPV6 + help + IPV6 multicast address to receive multicast traffic on. + + The default CoAP FF02::FD address is a link-local multicast address. + Consult IPV6 specifications or documentation for information about + meaning of different IPV6 multicast ranges. + endmenu diff --git a/examples/espidf-coap-server/src/certs/coap_ca.pem b/examples/espidf-coap-server/src/certs/coap_ca.pem index 1bdf23d..07900ec 100644 --- a/examples/espidf-coap-server/src/certs/coap_ca.pem +++ b/examples/espidf-coap-server/src/certs/coap_ca.pem @@ -1,23 +1,27 @@ -----BEGIN CERTIFICATE----- -MIID3DCCA0WgAwIBAgIJAMnlgL1czsmjMA0GCSqGSIb3DQEBCwUAMIGTMQswCQYD -VQQGEwJGUjEPMA0GA1UECAwGUmFkaXVzMRIwEAYDVQQHDAlTb21ld2hlcmUxFTAT -BgNVBAoMDEV4YW1wbGUgSW5jLjEgMB4GCSqGSIb3DQEJARYRYWRtaW5AZXhhbXBs -ZS5jb20xJjAkBgNVBAMMHUV4YW1wbGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4X -DTE3MDYwNzA4MDY0OVoXDTI3MDYwNTA4MDY0OVowgZMxCzAJBgNVBAYTAkZSMQ8w -DQYDVQQIDAZSYWRpdXMxEjAQBgNVBAcMCVNvbWV3aGVyZTEVMBMGA1UECgwMRXhh -bXBsZSBJbmMuMSAwHgYJKoZIhvcNAQkBFhFhZG1pbkBleGFtcGxlLmNvbTEmMCQG -A1UEAwwdRXhhbXBsZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwgZ8wDQYJKoZIhvcN -AQEBBQADgY0AMIGJAoGBALpWR23fn/TmHxsXsHdrydzPSd17fZkc71WsaicgQR66 -1tIVYb22UWGfj9KPM8THMsV74ew4ZkaQ39qvU0iuQIRrKARFHFok+vbaecgWMeWe -vGIqdnmyB9gJYaFOKgtSkfXsu2ddsqdvLYwcDbczrq8X9yEXpN6mnxXeCcPG4F0p -AgMBAAGjggE0MIIBMDAdBgNVHQ4EFgQUgigpdAUpONoDq0pQ3yfxrslCSpcwgcgG -A1UdIwSBwDCBvYAUgigpdAUpONoDq0pQ3yfxrslCSpehgZmkgZYwgZMxCzAJBgNV -BAYTAkZSMQ8wDQYDVQQIDAZSYWRpdXMxEjAQBgNVBAcMCVNvbWV3aGVyZTEVMBMG -A1UECgwMRXhhbXBsZSBJbmMuMSAwHgYJKoZIhvcNAQkBFhFhZG1pbkBleGFtcGxl -LmNvbTEmMCQGA1UEAwwdRXhhbXBsZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCCQDJ -5YC9XM7JozAMBgNVHRMEBTADAQH/MDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly93 -d3cuZXhhbXBsZS5jb20vZXhhbXBsZV9jYS5jcmwwDQYJKoZIhvcNAQELBQADgYEA -euxOBPInSJRKAIseMxPmAabtAqKNslZSmpG4He3lkKt+HM3jfznUt3psmD7j1hFW -S4l7KXzzajvaGYybDq5N9MqrDjhGn3VXZqOLMUNDL7OQq96TzgqsTBT1dmVSbNlt -PQgiAeKAk3tmH4lRRi9MTBSyJ6I92JYcS5H6Bs4ZwCc= +MIICDzCCAbSgAwIBAgIIAbOUoVFDz/QwDAYIKoZIzj0EAwIFADBcMRAwDgYDVQQD +EwdjZi1yb290MRQwEgYDVQQLEwtDYWxpZm9ybml1bTEUMBIGA1UEChMLRWNsaXBz +ZSBJb1QxDzANBgNVBAcTBk90dGF3YTELMAkGA1UEBhMCQ0EwHhcNMjAxMTExMTAz +MDMzWhcNMjExMTExMTAzMDMzWjBaMQ4wDAYDVQQDEwVjZi1jYTEUMBIGA1UECxML +Q2FsaWZvcm5pdW0xFDASBgNVBAoTC0VjbGlwc2UgSW9UMQ8wDQYDVQQHEwZPdHRh +d2ExCzAJBgNVBAYTAkNBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7/3EXOZn +GZXNEIj7LuQAMZ8lfRYSCnpME1TBjKjZPtVeztLtGWgkkLvIX11pAJcBh51cpi7Z +fQtGpVE9CLOh6aNgMF4wHQYDVR0OBBYEFEvf57UcJhYYkx14twkeitd691fVMAsG +A1UdDwQEAwIBBjAPBgNVHRMECDAGAQH/AgEBMB8GA1UdIwQYMBaAFAsi3KbVERiK +JzFCfC/GVrYksGzEMAwGCCqGSM49BAMCBQADRwAwRAIgc5nVF/5Pip0XB17IZXqi +V84FXanWdn9Z0SiPdpOgvZMCIH13vL9tkCCjPN3tg3TYRY/bzyGohFGBcTrrEtUr +rVIm +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIB4DCCAYWgAwIBAgIIQR8ro8AQ02AwDAYIKoZIzj0EAwIFADBcMRAwDgYDVQQD +EwdjZi1yb290MRQwEgYDVQQLEwtDYWxpZm9ybml1bTEUMBIGA1UEChMLRWNsaXBz +ZSBJb1QxDzANBgNVBAcTBk90dGF3YTELMAkGA1UEBhMCQ0EwHhcNMjAxMTExMTAz +MDMyWhcNMjExMTExMTAzMDMyWjBcMRAwDgYDVQQDEwdjZi1yb290MRQwEgYDVQQL +EwtDYWxpZm9ybml1bTEUMBIGA1UEChMLRWNsaXBzZSBJb1QxDzANBgNVBAcTBk90 +dGF3YTELMAkGA1UEBhMCQ0EwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZ1BRM +T1//Fzh9sneRZNwS4kgCxN1PvgwT271qCpYqyxnjLEa38AP1IAanhpiD/OkVc0Zd +7NgDPCw7n94EULMyoy8wLTAdBgNVHQ4EFgQUCyLcptURGIonMUJ8L8ZWtiSwbMQw +DAYDVR0TBAUwAwEB/zAMBggqhkjOPQQDAgUAA0cAMEQCIAdLEgcUWdpAl9jwdJiz +/cHW7/CBIWEvqiQfzE+XLyLOAiAvuxSdOtSDjh2aC5qEjUCH8CSKCxWB74j23tmp +aqPH4A== -----END CERTIFICATE----- diff --git a/examples/espidf-coap-server/src/certs/coap_server.crt b/examples/espidf-coap-server/src/certs/coap_server.crt index 8f1dfcd..6522f4e 100644 --- a/examples/espidf-coap-server/src/certs/coap_server.crt +++ b/examples/espidf-coap-server/src/certs/coap_server.crt @@ -1,70 +1,13 @@ -Certificate: - Data: - Version: 3 (0x2) - Serial Number: 47 (0x2f) - Signature Algorithm: sha1WithRSAEncryption - Issuer: C=FR, ST=Radius, L=Somewhere, O=Example Inc./emailAddress=admin@example.com, CN=Example Certificate Authority - Validity - Not Before: Jun 7 08:06:49 2017 GMT - Not After : Jun 5 08:06:49 2027 GMT - Subject: C=FR, ST=Radius, O=Example Inc., CN=Example Server Certificate/emailAddress=admin@example.com - Subject Public Key Info: - Public Key Algorithm: rsaEncryption - Public-Key: (2048 bit) - Modulus: - 00:c9:d8:e2:e0:75:91:83:87:d8:c8:80:c6:20:4d: - e9:14:24:30:98:33:53:fa:56:0e:ec:9a:43:7f:87: - a9:22:94:26:06:c7:ac:b5:d9:ec:55:06:81:b7:0d: - c9:24:51:49:fa:47:fb:4b:4e:fc:ed:75:8a:e1:28: - 32:bc:c5:e0:4c:45:c4:58:60:15:67:1e:6b:40:19: - 3f:f0:ab:92:61:92:2d:71:10:2e:f2:eb:bc:81:2f: - 5a:3b:74:ca:5f:fd:e0:ee:d1:d9:07:6a:6c:20:c0: - 07:88:b4:8b:0f:ad:1e:c9:4f:7c:11:98:37:89:15: - de:24:b1:11:1a:7c:97:4a:cf:f3:c8:cb:79:9e:9c: - c3:71:da:a6:94:97:f5:95:fd:61:06:44:e2:3f:12: - 43:0b:1d:33:48:91:d2:ce:4f:97:a1:ed:6a:30:c7: - 5d:98:b5:6e:0a:b7:4f:d9:03:ec:80:76:09:b0:40: - a1:a1:af:ab:2a:59:c4:0f:56:22:bc:be:14:be:18: - df:10:7d:5d:22:bf:e5:04:77:7a:75:6b:3e:eb:6d: - 20:a1:a7:60:d4:f1:87:9d:9f:60:b9:d3:db:2c:25: - f4:91:4a:f1:d2:40:e5:a1:10:88:a0:41:5a:98:40: - ca:15:d7:e3:e6:3e:c0:6a:d5:46:b2:b4:90:b4:ae: - 3b:e3 - Exponent: 65537 (0x10001) - X509v3 extensions: - X509v3 Extended Key Usage: - TLS Web Server Authentication - X509v3 CRL Distribution Points: - - Full Name: - URI:http://www.example.com/example_ca.crl - - Signature Algorithm: sha1WithRSAEncryption - a4:25:21:51:0b:22:6c:63:8d:a9:c1:4f:04:33:69:79:34:f0: - 36:dd:8f:6a:27:5f:07:a2:1d:ef:8b:f0:96:e6:e7:a3:b8:3b: - 85:5e:3f:26:43:8a:8e:95:58:9c:a6:db:9c:51:bf:ea:53:16: - 3e:c1:a8:11:1a:c6:cf:0e:a1:17:18:64:d2:05:f1:c0:9c:a6: - 2b:16:c4:29:54:03:d2:17:bd:15:74:d6:ad:8a:8f:2d:cc:27: - 3b:88:88:f2:ea:d0:a2:cb:e9:42:57:df:26:9f:8a:a2:02:2f: - 35:b6:19:1d:26:43:44:af:12:4b:bc:b9:84:50:02:fd:1d:fa: - 50:e8 -----BEGIN CERTIFICATE----- -MIIDWTCCAsKgAwIBAgIBLzANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UEBhMCRlIx -DzANBgNVBAgMBlJhZGl1czESMBAGA1UEBwwJU29tZXdoZXJlMRUwEwYDVQQKDAxF -eGFtcGxlIEluYy4xIDAeBgkqhkiG9w0BCQEWEWFkbWluQGV4YW1wbGUuY29tMSYw -JAYDVQQDDB1FeGFtcGxlIENlcnRpZmljYXRlIEF1dGhvcml0eTAeFw0xNzA2MDcw -ODA2NDlaFw0yNzA2MDUwODA2NDlaMHwxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIDAZS -YWRpdXMxFTATBgNVBAoMDEV4YW1wbGUgSW5jLjEjMCEGA1UEAwwaRXhhbXBsZSBT -ZXJ2ZXIgQ2VydGlmaWNhdGUxIDAeBgkqhkiG9w0BCQEWEWFkbWluQGV4YW1wbGUu -Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAydji4HWRg4fYyIDG -IE3pFCQwmDNT+lYO7JpDf4epIpQmBsestdnsVQaBtw3JJFFJ+kf7S0787XWK4Sgy -vMXgTEXEWGAVZx5rQBk/8KuSYZItcRAu8uu8gS9aO3TKX/3g7tHZB2psIMAHiLSL -D60eyU98EZg3iRXeJLERGnyXSs/zyMt5npzDcdqmlJf1lf1hBkTiPxJDCx0zSJHS -zk+Xoe1qMMddmLVuCrdP2QPsgHYJsEChoa+rKlnED1YivL4UvhjfEH1dIr/lBHd6 -dWs+620goadg1PGHnZ9gudPbLCX0kUrx0kDloRCIoEFamEDKFdfj5j7AatVGsrSQ -tK474wIDAQABo08wTTATBgNVHSUEDDAKBggrBgEFBQcDATA2BgNVHR8ELzAtMCug -KaAnhiVodHRwOi8vd3d3LmV4YW1wbGUuY29tL2V4YW1wbGVfY2EuY3JsMA0GCSqG -SIb3DQEBBQUAA4GBAKQlIVELImxjjanBTwQzaXk08Dbdj2onXweiHe+L8Jbm56O4 -O4VePyZDio6VWJym25xRv+pTFj7BqBEaxs8OoRcYZNIF8cCcpisWxClUA9IXvRV0 -1q2Kjy3MJzuIiPLq0KLL6UJX3yafiqICLzW2GR0mQ0SvEku8uYRQAv0d+lDo +MIICAzCCAaagAwIBAgIJANqCHDjOKHh+MAwGCCqGSM49BAMCBQAwWjEOMAwGA1UE +AxMFY2YtY2ExFDASBgNVBAsTC0NhbGlmb3JuaXVtMRQwEgYDVQQKEwtFY2xpcHNl +IElvVDEPMA0GA1UEBxMGT3R0YXdhMQswCQYDVQQGEwJDQTAeFw0yMDExMTExMDMw +MzRaFw0yMTExMTExMDMwMzRaMF4xEjAQBgNVBAMTCWNmLXNlcnZlcjEUMBIGA1UE +CxMLQ2FsaWZvcm5pdW0xFDASBgNVBAoTC0VjbGlwc2UgSW9UMQ8wDQYDVQQHEwZP +dHRhd2ExCzAJBgNVBAYTAkNBMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+obM +gHmMB7zS4KArciXPD7CrvgEYqlnAf7NOTdb54RbTr4qEpPL+OJ6Pg8VhrF4hGEne +T6Aa4qqpmTkxmfT0vqNPME0wHQYDVR0OBBYEFE4XpfFad+F3+RcwI+s1cmJbTZWG +MAsGA1UdDwQEAwIHgDAfBgNVHSMEGDAWgBRL3+e1HCYWGJMdeLcJHorXevdX1TAM +BggqhkjOPQQDAgUAA0kAMEYCIQCEo+O5zqYKdwi/ElB4wfNVIf76P1OhIXAT5CHc +3ebBPQIhAN6UhCgQ0av6kf7INCazV3KmN7HmPXARaY4YKWsRwsg+ -----END CERTIFICATE----- diff --git a/examples/espidf-coap-server/src/certs/coap_server.key b/examples/espidf-coap-server/src/certs/coap_server.key index 9b34332..3628515 100644 --- a/examples/espidf-coap-server/src/certs/coap_server.key +++ b/examples/espidf-coap-server/src/certs/coap_server.key @@ -1,27 +1,4 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAydji4HWRg4fYyIDGIE3pFCQwmDNT+lYO7JpDf4epIpQmBses -tdnsVQaBtw3JJFFJ+kf7S0787XWK4SgyvMXgTEXEWGAVZx5rQBk/8KuSYZItcRAu -8uu8gS9aO3TKX/3g7tHZB2psIMAHiLSLD60eyU98EZg3iRXeJLERGnyXSs/zyMt5 -npzDcdqmlJf1lf1hBkTiPxJDCx0zSJHSzk+Xoe1qMMddmLVuCrdP2QPsgHYJsECh -oa+rKlnED1YivL4UvhjfEH1dIr/lBHd6dWs+620goadg1PGHnZ9gudPbLCX0kUrx -0kDloRCIoEFamEDKFdfj5j7AatVGsrSQtK474wIDAQABAoIBAQC2kGDEPBJdMSW2 -VCLfXRiPixwYzXQLXIMrJWwfkQg9qlmqkDd6U50aWkRA2UswegW7RhfYSZ0i+cmf -VMhvTVpOIlwwwtcY6b5/v1bBy60eaySGuuh79xQMlFO8qynQIMStvUfbGTqrdIRb -9VBB4YeS9T12fILejtTZwv2BQ2dj1Y1SCay6Ri85UzJqSClRKgHISybvVdLNjPvP -0TRFBr57zyjL6WE8teKiKchzQko2u86No5uBCdKGsrAkrsdcR0YqlM/pZxd3VKNm -+eny0k+dZZlvcPxzkzP4hEp9+Rw5rP9/s3s/cCwvuuC5JO32ATBWKCbTvPv/XPDb -MdSJtOshAoGBAPzk0eswkcbFYtpnpBNmBAr1dtAdW1lfjUI2ucMMwt7Wns0P/tt+ -gq6Hi1wTaGP0l/dIECgeHwjtWj31ZJjQtFJ1y/kafxo4o9cA8vCydpdvSZaldAfg -sbLlDTDYzEpelaDIbNQBBXFoC5U9JlBhBsIFCL5Z8ZuIeFPsb7t5wwuHAoGBAMxT -jyWfNm1uNxp1xgCnrRsLPQPVnURrSFAqcHrECqRu3F7sozTN7q/cZViemxPvVDGQ -p9c+9bHwaYvW4trO5qDHJ++gGwm5L52bMAY1VUfeTt67fqrey43XpdmzcTX1V9Uj -QWawPUCSDzFjL1MjfCIejtyYf5ash53vj+T8r/vFAoGAA/OPVB1uKazr3n3AEo2F -gqZTNO1AgCT+EArK3EFWyiSQVqPpV4SihheYFdg3yVgJB9QYbIgL9BfBUTaEW97m -8mLkzP+c/Mvlw3ZAVYJ0V+llPPVY2saoACOUES9SAdd4fwqiqK1baGo3xB0wfBEI -CgAKIu9E1ylKuAT5ufQtGAECgYEAtP/kU5h5N3El4QupTdU7VDSdZTMqsHw0v8cI -gsf9AXKvRmtrnBA8u46KPHmruHoO5CVXeSZtsaXdaaH+rYQQ6yXg67WxnehtFLlv -TmCaXiLBTS9cYvMf8FOyuGnsBLeEietEOTov2G5KhR5uwsAxa2wUc7endor5S9/2 -YQuyvV0CgYALbiFpILd5l1ip65eE6JdA3hfttUbV2j2NSW12ej69vqbeOfaSgNse -uYCcXFsBbQPhNPwA+4d1oCe8SyXZg1f7gE812z2Tyr/3vdVnNZlitoxhsHmGiyS7 -gZdaTYCb78l9z0EBdaCVvA16owEle4SR6f9eCwzSI0WPOUra+x/hrA== ------END RSA PRIVATE KEY----- +-----BEGIN PRIVATE KEY----- +MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCCLBQT66xp2w4+1K+Ai +/TXEC8tQZBxl9brFyK4F7AQNGw== +-----END PRIVATE KEY----- diff --git a/examples/espidf-coap-server/src/coap_server_example_main.c b/examples/espidf-coap-server/src/coap_server_example_main.c index 58a698d..ed96cc6 100644 --- a/examples/espidf-coap-server/src/coap_server_example_main.c +++ b/examples/espidf-coap-server/src/coap_server_example_main.c @@ -29,15 +29,10 @@ #include "protocol_examples_common.h" -#if 1 -/* Needed until coap_dtls.h becomes a part of libcoap proper */ -#include "libcoap.h" -#include "coap_dtls.h" -#endif -#include "coap.h" +#include "coap3/coap.h" /* The examples use simple Pre-Shared-Key configuration that you can set via - 'make menuconfig'. + 'idf.py menuconfig'. If you'd rather not, just change the below entries to strings with the config you want - ie #define EXAMPLE_COAP_PSK_KEY "some-agreed-preshared-key" @@ -49,7 +44,7 @@ #define EXAMPLE_COAP_PSK_KEY CONFIG_EXAMPLE_COAP_PSK_KEY /* The examples use CoAP Logging Level that - you can set via 'make menuconfig'. + you can set via 'idf.py menuconfig'. If you'd rather not, just change the below entry to a value that is between 0 and 7 with @@ -67,8 +62,10 @@ static int espressif_data_len = 0; Server cert, taken from coap_server.crt Server key, taken from coap_server.key - The PEM, CRT and KEY file are examples taken from the wpa2 enterprise - example. + The PEM, CRT and KEY file are examples taken from + https://github.com/eclipse/californium/tree/master/demo-certs/src/main/resources + as the Certificate test (by default) for the coap_client is against the + californium server. To embed it in the app binary, the PEM, CRT and KEY file is named in the component.mk COMPONENT_EMBED_TXTFILES variable. @@ -87,39 +84,42 @@ extern uint8_t server_key_end[] asm("_binary_coap_server_key_end"); * The resource handler */ static void -hnd_espressif_get(coap_context_t *ctx, coap_resource_t *resource, +hnd_espressif_get(coap_resource_t *resource, coap_session_t *session, - coap_pdu_t *request, coap_binary_t *token, - coap_string_t *query, coap_pdu_t *response) + const coap_pdu_t *request, + const coap_string_t *query, + coap_pdu_t *response) { - coap_add_data_blocked_response(resource, session, request, response, token, - COAP_MEDIATYPE_TEXT_PLAIN, 0, - (size_t)espressif_data_len, - (const u_char *)espressif_data); + coap_pdu_set_code(response, COAP_RESPONSE_CODE_CONTENT); + coap_add_data_large_response(resource, session, request, response, + query, COAP_MEDIATYPE_TEXT_PLAIN, 60, 0, + (size_t)espressif_data_len, + (const u_char *)espressif_data, + NULL, NULL); } static void -hnd_espressif_put(coap_context_t *ctx, - coap_resource_t *resource, +hnd_espressif_put(coap_resource_t *resource, coap_session_t *session, - coap_pdu_t *request, - coap_binary_t *token, - coap_string_t *query, + const coap_pdu_t *request, + const coap_string_t *query, coap_pdu_t *response) { size_t size; - unsigned char *data; + size_t offset; + size_t total; + const unsigned char *data; coap_resource_notify_observers(resource, NULL); if (strcmp (espressif_data, INITIAL_DATA) == 0) { - response->code = COAP_RESPONSE_CODE(201); + coap_pdu_set_code(response, COAP_RESPONSE_CODE_CREATED); } else { - response->code = COAP_RESPONSE_CODE(204); + coap_pdu_set_code(response, COAP_RESPONSE_CODE_CHANGED); } - /* coap_get_data() sets size to 0 on error */ - (void)coap_get_data(request, &size, &data); + /* coap_get_data_large() sets size to 0 on error */ + (void)coap_get_data_large(request, &size, &data, &offset, &total); if (size == 0) { /* re-init */ snprintf(espressif_data, sizeof(espressif_data), INITIAL_DATA); @@ -131,18 +131,16 @@ hnd_espressif_put(coap_context_t *ctx, } static void -hnd_espressif_delete(coap_context_t *ctx, - coap_resource_t *resource, +hnd_espressif_delete(coap_resource_t *resource, coap_session_t *session, - coap_pdu_t *request, - coap_binary_t *token, - coap_string_t *query, + const coap_pdu_t *request, + const coap_string_t *query, coap_pdu_t *response) { coap_resource_notify_observers(resource, NULL); snprintf(espressif_data, sizeof(espressif_data), INITIAL_DATA); espressif_data_len = strlen(espressif_data); - response->code = COAP_RESPONSE_CODE(202); + coap_pdu_set_code(response, COAP_RESPONSE_CODE_DELETED); } #ifdef CONFIG_COAP_MBEDTLS_PKI @@ -163,6 +161,18 @@ verify_cn_callback(const char *cn, } #endif /* CONFIG_COAP_MBEDTLS_PKI */ +static void +coap_log_handler (coap_log_t level, const char *message) +{ + uint32_t esp_level = ESP_LOG_INFO; + char *cp = strchr(message, '\n'); + + if (cp) + ESP_LOG_LEVEL(esp_level, TAG, "%.*s", (int)(cp-message), message); + else + ESP_LOG_LEVEL(esp_level, TAG, "%s", message); +} + static void coap_example_server(void *p) { coap_context_t *ctx = NULL; @@ -171,6 +181,7 @@ static void coap_example_server(void *p) snprintf(espressif_data, sizeof(espressif_data), INITIAL_DATA); espressif_data_len = strlen(espressif_data); + coap_set_log_handler(coap_log_handler); coap_set_log_level(EXAMPLE_COAP_LOG_DEFAULT_LEVEL); while (1) { @@ -179,15 +190,16 @@ static void coap_example_server(void *p) /* Prepare the CoAP server socket */ coap_address_init(&serv_addr); - serv_addr.addr.sin.sin_family = AF_INET; - serv_addr.addr.sin.sin_addr.s_addr = INADDR_ANY; - serv_addr.addr.sin.sin_port = htons(COAP_DEFAULT_PORT); + serv_addr.addr.sin6.sin6_family = AF_INET6; + serv_addr.addr.sin6.sin6_port = htons(COAP_DEFAULT_PORT); ctx = coap_new_context(NULL); if (!ctx) { ESP_LOGE(TAG, "coap_new_context() failed"); continue; } + coap_context_set_block_mode(ctx, + COAP_BLOCK_USE_LIBCOAP|COAP_BLOCK_SINGLE_BODY); #ifdef CONFIG_COAP_MBEDTLS_PSK /* Need PSK setup before we set up endpoints */ coap_context_set_psk(ctx, "CoAP", @@ -196,6 +208,7 @@ static void coap_example_server(void *p) #endif /* CONFIG_COAP_MBEDTLS_PSK */ #ifdef CONFIG_COAP_MBEDTLS_PKI + /* Need PKI setup before we set up endpoints */ unsigned int ca_pem_bytes = ca_pem_end - ca_pem_start; unsigned int server_crt_bytes = server_crt_end - server_crt_start; unsigned int server_key_bytes = server_key_end - server_key_start; @@ -214,7 +227,7 @@ static void coap_example_server(void *p) * define what checking actually takes place. */ dtls_pki.verify_peer_cert = 1; - dtls_pki.require_peer_cert = 1; + dtls_pki.check_common_ca = 1; dtls_pki.allow_self_signed = 1; dtls_pki.allow_expired_certs = 1; dtls_pki.cert_chain_validation = 1; @@ -256,7 +269,7 @@ static void coap_example_server(void *p) /* This is not critical as unencrypted support is still available */ ESP_LOGI(TAG, "MbedTLS (D)TLS Server Mode not configured"); #else /* CONFIG_MBEDTLS_TLS_SERVER */ - serv_addr.addr.sin.sin_port = htons(COAPS_DEFAULT_PORT); + serv_addr.addr.sin6.sin6_port = htons(COAPS_DEFAULT_PORT); ep = coap_new_endpoint(ctx, &serv_addr, COAP_PROTO_DTLS); if (!ep) { ESP_LOGE(TAG, "dtls: coap_new_endpoint() failed"); @@ -267,7 +280,7 @@ static void coap_example_server(void *p) /* This is not critical as unencrypted support is still available */ ESP_LOGI(TAG, "MbedTLS (D)TLS Server Mode not configured"); } -#endif /* CONFIG_COAP_MBEDTLS_PSK CONFIG_COAP_MBEDTLS_PKI */ +#endif /* CONFIG_COAP_MBEDTLS_PSK || CONFIG_COAP_MBEDTLS_PKI */ resource = coap_resource_init(coap_make_str_const("Espressif"), 0); if (!resource) { ESP_LOGE(TAG, "coap_resource_init() failed"); @@ -280,10 +293,26 @@ static void coap_example_server(void *p) coap_resource_set_get_observable(resource, 1); coap_add_resource(ctx, resource); +#if defined(CONFIG_EXAMPLE_COAP_MCAST_IPV4) || defined(CONFIG_EXAMPLE_COAP_MCAST_IPV6) + esp_netif_t *netif = NULL; + for (int i = 0; i < esp_netif_get_nr_of_ifs(); ++i) { + char buf[8]; + netif = esp_netif_next(netif); + esp_netif_get_netif_impl_name(netif, buf); +#if defined(CONFIG_EXAMPLE_COAP_MCAST_IPV4) + coap_join_mcast_group_intf(ctx, CONFIG_EXAMPLE_COAP_MULTICAST_IPV4_ADDR, buf); +#endif /* CONFIG_EXAMPLE_COAP_MCAST_IPV4 */ +#if defined(CONFIG_EXAMPLE_COAP_MCAST_IPV6) + /* When adding IPV6 esp-idf requires ifname param to be filled in */ + coap_join_mcast_group_intf(ctx, CONFIG_EXAMPLE_COAP_MULTICAST_IPV6_ADDR, buf); +#endif /* CONFIG_EXAMPLE_COAP_MCAST_IPV6 */ + } +#endif /* CONFIG_EXAMPLE_COAP_MCAST_IPV4 || CONFIG_EXAMPLE_COAP_MCAST_IPV6 */ + wait_ms = COAP_RESOURCE_CHECK_TIME * 1000; while (1) { - int result = coap_run_once(ctx, wait_ms); + int result = coap_io_process(ctx, wait_ms); if (result < 0) { break; } else if (result && (unsigned)result < wait_ms) {