|
@@ -1169,6 +1169,21 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
|
|
!(versp = progp->pg_vers[vers]))
|
|
|
goto err_bad_vers;
|
|
|
|
|
|
+ /*
|
|
|
+ * Some protocol versions (namely NFSv4) require some form of
|
|
|
+ * congestion control. (See RFC 7530 section 3.1 paragraph 2)
|
|
|
+ * In other words, UDP is not allowed. We mark those when setting
|
|
|
+ * up the svc_xprt, and verify that here.
|
|
|
+ *
|
|
|
+ * The spec is not very clear about what error should be returned
|
|
|
+ * when someone tries to access a server that is listening on UDP
|
|
|
+ * for lower versions. RPC_PROG_MISMATCH seems to be the closest
|
|
|
+ * fit.
|
|
|
+ */
|
|
|
+ if (versp->vs_need_cong_ctrl &&
|
|
|
+ !test_bit(XPT_CONG_CTRL, &rqstp->rq_xprt->xpt_flags))
|
|
|
+ goto err_bad_vers;
|
|
|
+
|
|
|
procp = versp->vs_proc + proc;
|
|
|
if (proc >= versp->vs_nproc || !procp->pc_func)
|
|
|
goto err_bad_proc;
|